React

组件的生命周期

生命周期

  1. 初始化
    • componentWillMount(render之前最后一次修改状态的机会)
    • render(只能访问this.props和this.state,不允许修改状态和DOM输出)
    • componentDidMount(成功render并渲染完成真实DOM之后触发,可以修改DOM)
  2. 运行中
    • componentWillReceiveProps(父组件修改属性触发)
    • shouldComponentUpdate(返回false会阻止render调用)
    • componentWillUpdate(不能修改属性和状态)
    • render(只能访问this.props和this.state,不允许修改状态和DOM输出)
    • componentDidUpdate(可以修改DOM)
  3. 销毁
    • componentWillUnmount(在删除组件前进行清理操作)

新生命周期

  1. getDerivedStateFromProps
    • 第一次初始化组件以及后续更新的过程中(包括自身状态更新、父传子),返回一个对象作为新的state
    • 返回null则不需要更新state(除了销毁阶段,其它阶段都会执行)

代码示例:

import React, {Component} from 'react';


export default class Test04 extends Component {
    state = {  // 必须存在状态
        name: 'HQSY',
        age: 24
    }

    static getDerivedStateFromProps(nextProps, nextState) {  // 必须是一个类属性
        console.log(nextState)
        return {  // 必须return
            name: nextState.name.substring(0, 1).toLowerCase()  // 每次更新状态时
        }  // 运行阶段(render)前修改状态
    }

    render() {
        return (
            <div>
                {this.state.name}
            </div>
        );
    }
}
// src/test/Test04.jsx

// 触发时机为update发送的时候,在render之后DOM渲染之前返回一个值,作为componentDidUpdate的第三个参数
import React, {Component} from 'react';


export default class Test04 extends Component {
    state = {
        text: 'aaa'
    }

    componentDidUpdate(prevProps, prevState, snapshot) {
        console.log(snapshot)  // return出去的值
    }

    getSnapshotBeforeUpdate(prevProps, prevState) {  // 老的属性和状态
        return 'return'
    }

    render() {
        return (
            <div>
                <button onClick={() => {
                    this.setState({
                        text: 'bbb'
                    })
                }}>Click
                </button>
            </div>
        );
    }
}

中性能优化

代码示例:

// src/test/Test04.jsx

// PureComponent:自动比较新、旧props和state,决定shouldComponentUpdate返回true或false,从而决定要不要render
import React, {PureComponent} from 'react';


export default class Test04 extends PureComponent {

    render() {
        return (
            <div>

            </div>
        );
    }
}