React Principles Explained

React Principles Explained

1. setState() Description

1.1 Update data

setState() is used to update data asynchronously

You can call setState() multiple times, and it will only trigger a re-rendering once.

import React from 'react'
import ReactDOM from 'react-dom'
class Opp extends React.Component {
	state = {
		count: 1,
	}
	handleClick = () => {
		// Asynchronously update data this.setState({
			count: this.state.count + 1,
		})
        this.setState({
			count: this.state.count + 1,
		})
		console.log(this.state.count) // 1
	}
	render() {
		return (
			<div>
				<h1>Counter: {this.state.count}</h1>
				<button onClick={this.handleClick}>+1</button>
			</div>
		)
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

1.2 Recommended syntax

Use the setState((state, props)=>{}) syntax

state: represents the latest state, props: represents the latest props

import React from 'react'
import ReactDOM from 'react-dom'
class Opp extends React.Component {
	state = {
		count: 1,
	}
	handleClick = () => {
		/* // Asynchronously update data this.setState({
			count: this.state.count + 1,
		})
		console.log(this.state.count) //1
    this.setState({
			count: this.state.count + 1,
		})
		console.log(this.state.count) //1
    */
		// Recommended syntax this.setState((state, props) => {
			return {
				count: state.count + 1,
			}
		})
		this.setState((state, props) => {
			console.log('Second call:', state) //2
			return {
				count: state.count + 1,
			}
		})
		console.log(this.state.count) // 3
	}
	render() {
		return (
			<div>
				<h1>Counter: {this.state.count}</h1>
				<button onClick={this.handleClick}>+1</button>
			</div>
		)
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

1.3 Second Parameter

  • Perform an action immediately after the state is updated (the page has finished re-rendering)
  • Syntax: setState(updater[,callback])

callback refers to the callback function, which can be added or not

import React from 'react'
import ReactDOM from 'react-dom'
class Opp extends React.Component {
	state = {
		count: 1,
	}
	handleClick = () => {
		this.setState(
			(state, props) => {
				return {
					count: state.count + 1,
				}
			},
			// Execute immediately after the state is updated and re-rendered () => {
				console.log('Status update completed:', this.state.count) // 2
				console.log(document.getElementById('title').innerText) // Counter: 2
				document.title = 'Updated count is:' + this.state.count
			}
		)
		console.log(this.state.count) //1
	}
	render() {
		return (
			<div>
				<h1 id='title'>Counter: {this.state.count}</h1>
				<button onClick={this.handleClick}>+1</button>
			</div>
		)
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

2. JSX syntax conversion process

  • JSX is just syntactic sugar (simplified syntax) for the createElement() method.
  • JSX syntax is compiled into createElement() method by @babel/preset-react plugin
  • React element: is an object that describes what you want to see on the screen

insert image description here

import React from 'react'
import ReactDOM from 'react-dom'
//Conversion process of JSX syntax// const element = <h1 className='greeting'>Hello JSX</h1>
const element = React.createElement(
	'h1',
	{
		className: 'greeting',
	},
	'Hello JSX'
)
console.log(element)
ReactDOM.render(element, document.getElementById('root'))

3. Component update mechanism

  • Two functions of setState(): 1. Modify state 2. Update components (UI)
  • Process: When the parent component is re-rendered, the child components will also be re-rendered, but only the current component subtree (the current component and all its child components) will be rendered

insert image description here

4. Component performance optimization

4.1 Reducing state

  • Reduce state: only store data related to component rendering (such as count/list data/loading, etc.)
  • Note: Do not put books that do not need to be rendered in the state (such as timer id, etc.)
  • Data that needs to be used in multiple methods should be placed in this

4.2 Avoid unnecessary re-rendering

  • Component update mechanism: Parent component updates will cause child components to be updated as well
  • Problem: Child components are re-rendered even when they have not changed, causing unnecessary re-rendering
  • Solution: Use the hook function shouldComponentUpdate(nextProps, nextState)
  • Function: Determines whether the component should be re-rendered by returning true, false means not to be re-rendered
  • Triggering time: Hook function in the update phase, executed before the component is re-rendered (shouldComponentUpdate -> render)
import React from 'react'
import ReactDOM from 'react-dom'
class Opp extends React.Component {
	state = {
		count: 0,
	}
	handleClick = () => {
		this.setState((state) => {
			return {
				count: this.state.count + 1,
			}
		})
	}
	//Hook function shouldComponentUpdate(nextProps, nextState) {
		// Return false to prevent the component from re-rendering // return false
		// The latest state console.log('latest state', nextState)
		// Status before update console.log(this.state)
		// Return true, the component re-renders return true
	}
	render() {
		console.log('Component updated')
		return (
			<div>
				<h1>Counter: {this.state.count}</h1>
				<button onClick={this.handleClick}>+1</button>
			</div>
		)
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

Example: Random Numbers

Via nextState

import React from 'react'
import ReactDOM from 'react-dom'
// Generate random numbers class Opp extends React.Component {
	state = {
		number: 0,
	}
	handleClick = () => {
		this.setState((state) => {
			return {
				number: Math.floor(Math.random() * 3),
			}
		})
	}
	// The random numbers generated twice may be the same, so there is no need to re-render shouldComponentUpdate(nextState) {
		console.log('Latest state:', nextState, 'Current state:', this.state)
		return nextState.number !== this.state.number
		/* if ( nextState.number !== this.state.number) {
			return true
		}
		return false*/
	}
	render() {
		console.log('render')
		return (
			<div>
				<h1>Random number: {this.state.number}</h1>
				<button onClick={this.handleClick}>Regenerate</button>
			</div>
		)
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

Via nextState

import React from 'react'
import ReactDOM from 'react-dom'
// Generate random numbers class Opp extends React.Component {
	state = {
		number: 0,
	}
	handleClick = () => {
		this.setState((state) => {
			return {
				number: Math.floor(Math.random() * 3),
			}
		})
	}
	render() {
		return (
			<div>
				<NumberBox number={this.state.number} />
				<button onClick={this.handleClick}>Regenerate</button>
			</div>
		)
	}
}
class NumberBox extends React.Component {
	shouldComponentUpdate(nextProps) {
		console.log('latest props:', nextProps, 'current props:', this.props)
		return nextProps.number !== this.props.number
	}
	render() {
		console.log('subcomponent render')
		return <h1>Random number: {this.props.number}</h1>
	}
}
ReactDOM.render(<Opp />, document.getElementById('root'))

Summarize

This article ends here. I hope it can be helpful to you. I also hope that you can pay more attention to more content on 123WORDPRESS.COM!

You may also be interested in:
  • A detailed explanation of how React Fiber works
  • ES6 class chain inheritance, instantiation and react super (props) principle detailed explanation
  • Detailed explanation of the usage and principle analysis of connect in react-redux
  • React-router 4 on-demand loading implementation and principle detailed explanation

<<:  Docker container monitoring principle and cAdvisor installation and usage instructions

>>:  Common symbols in Unicode

Recommend

How to insert pictures into HTML pages and add map index examples

1. Image formats supported on the WEB: GIF: can s...

Media query combined with rem layout in CSS3 to adapt to mobile screens

CSS3 syntax: (1rem = 100px for a 750px design) @m...

Vue implements a small weather forecast application

This is a website I imitated when I was self-stud...

Detailed explanation of MySQL's FreeList mechanism

1. Introduction After MySQL is started, BufferPoo...

The difference between Display, Visibility, Opacity, rgba and z-index: -1 in CSS

We often need to control the hidden, transparent ...

Select does not support double click dbclick event

XML/HTML CodeCopy content to clipboard < div c...

Detailed tutorial for downloading, installing and configuring MySQL 5.7.27

Table of contents 1. Download steps 2. Configure ...

A permanent solution to MYSQL's inability to recognize Chinese

In most cases, MySQL does not support Chinese whe...

How to use CSS to achieve data hotspot effect

The effect is as follows: analyze 1. Here you can...

Detailed explanation of the pitfalls of MySQL 8.0

I updated MySQL 8.0 today. The first problem: Nav...

Bootstrap FileInput implements image upload function

This article example shares the specific code of ...