1.1setState{}的两个作用:
1.2过程:父组件重新渲染时,也会重新渲染子组件。但只会渲染当前组件子树(当前组件及其所有子组件)

2.减轻state
- class Hello extends Component{
- componentDidMount(){
- //timeId存储到this中,而不是state中
- this.timeId = setInterval(()=>{},2000)
- }
- commponentWillUnmount(){
- clearInterval(this.timerId)
- }
- render(){...}
- }
3.避免不必要的重新渲染
- import { number } from 'prop-types';
- import React from 'react';
- import ReactDOM from 'react-dom';
- // import MyEditor from './components/MyEditor';
-
- class App extends React.Component{
- state={
- number:0
- }
- handleClick = () =>{
- this.setState(()=>{
- return{
- number: Math.floor(Math.random()*3)
- }
-
- })
- }
-
- shouldComponentUpdate(nextprops,nextState){
- console.log('最新的state:',nextState)
- console.log('this.state:',this.state)
- //返回false,阻止组件重新渲染
- return false
- }
- render(){
- return(
- <div>
- <h1>随机数:{this.state.number}h1>
- <button onClick={this.handleClick}>重新生成button>
- div>
- )
- }
- }
-
-
- ReactDOM.render(<App>App>,
- document.getElementById('root'))
改进:
- import { number } from 'prop-types';
- import React from 'react';
- import ReactDOM from 'react-dom';
- // import MyEditor from './components/MyEditor';
-
- class App extends React.Component{
- state={
- number:0
- }
- handleClick = () =>{
- this.setState(()=>{
- return{
- number: Math.floor(Math.random()*3)
- }
-
- })
- }
-
- shouldComponentUpdate(nextprops,nextState){
- console.log('最新的state:',nextState)
- console.log('this.state:',this.state)
- // //返回false,阻止组件重新渲染
- // return false
- if(nextState.number === this.state.number) return false
- else return true
- }
- render(){
- console.log('重新渲染')
- return(
- <div>
- <h1>随机数:{this.state.number}h1>
- <button onClick={this.handleClick}>重新生成button>
- div>
- )
- }
- }
-
-
- ReactDOM.render(<App>App>,
- document.getElementById('root'))

更加简洁的写法:if nextState.number !== this.state.number
4.使用另外一个参数(nextProps)
- import { number } from 'prop-types';
- import React from 'react';
- import ReactDOM from 'react-dom';
- // import MyEditor from './components/MyEditor';
-
- class App extends React.Component{
- state={
- number:0
- }
- handleClick = () =>{
- this.setState(()=>{
- return{
- number: Math.floor(Math.random()*3)
- }
-
- })
- }
-
- render(){
- // console.log('重新渲染')
- return(
- <div>
- <NumberBox number={this.state.number}>NumberBox>
- <button onClick={this.handleClick}>重新生成button>
- div>
- )
- }
- }
-
-
- class NumberBox extends React.Component{
- shouldComponentUpdate(nextProps,nextState){
- console.log('最新的props:',nextProps,',当前props',this.props)
- return nextProps.number !== this.props.number
- }
- render(){
- console.log('重新渲染')
- return <h1>随机数:{this.props.number}h1>
- }
- }
-
-
- ReactDOM.render(<App>App>,
- document.getElementById('root'))