react 生命周期

212 阅读2分钟

流程图展示

单个组件生命周期分析

- 第一步:defaultProps
- 第二步:constructor 构造函数
- 第三步:组件将要加载 componentWillMount
- 第四步:render
- 第五步:组件加载完成 componentDidMount
- 第六步:组件是否应该更新shouldComponentUpdate
- 第七步:组件将要更新 componentWillUpdate
- 第八步:组件更新完成 componentDidUpdate

父组件和子组件混合的生命周期

- 1.父亲:constructor 构造函数
- 2.父亲:组件将要加载 componentWillMount
- 3.父亲:render
- 4.儿子:childcomponentWillMount
- 5.儿子:child render
- 6.儿子:childcomponentDidMount
- 7.父亲:组件加载完成 componentDidMount

点击加加按钮后,数据更新时

- 1.父亲:组件是否应该更新 shouldComponentUpdate
- 2.父亲:组件将要更新 componentWillUpdate
- 3.父亲:render
- 4.儿子:childcomponentWillReceiveProps
- 5.儿子:child render
- 6.儿子:组件更新完成 componentDidUpdate

代码展示

// 父组件
    // 先走 defaultProps,然后走constructor
    class Counter extends Component {
      static defaultProps = {
        name: "tian"
      };
    
      constructor(props) {
        super();
        this.state = { number: 0 };
        console.log("1. constructor 构造函数");
      }
    
      componentWillMount() {
        // 加载同步本地的代码 如 :localStorage.getItem('a),只渲染一次
        console.log("2.组件将要加载 componentWillMount");
      }
    
      componentDidMount() {
        // 异步代码 ,也可以放在componentWillMount中
        console.log("4.组件加载完成 componentDidMount");
      }
    
      // 点击加加
      // 不能随便使用 setState, 可能会出现死循环
      handleClick = () => {
          this.setState({number:this.state.number+1})
      }
    
      // 组件是否应该更新,返回布尔值,默认返回 true
      // 组件优化: 如果这次更新和上次相同,就阻止更新
      // React.pureComponent 也能实现这个优化,缺点:同一个引用空间也不会更新
      shouldComponentUpdate (nextProps,nextState) { // 下一次的属性,下一次的状态
          console.log(nextState);
          console.log("5. 组件是否应该更新 shouldComponentUpdate");
    
          // 如果这次更新和上次相同,就阻止更新
          //   return nextState.number !== this.state.number;  // 如果此函数中调用了false,就不会调用render的方法
    
          return nextState.number % 2;
        }
    
      // 组件将要更新
      componentWillUpdate () {
          console.log("6. 组件将要更新 componentWillUpdate");
      }
    
      //组件更新完成
      componentDidUpdate () {
          console.log("7. 组件更新完成 componentDidUpdate");
      }
    
      render() {
        console.log("3. render");
    
        return (
          <div>
            <p>{this.state.number}</p>
            <button onClick={this.handleClick}>+</button>
    
            <ChildCounter n={this.state.number}></ChildCounter>
          </div>
        );
      }
    }
    
    
    
    // 子组件
    class ChildCounter extends Component {
        // 组件将要加载
        componentWillMount () {
            console.log("child" + "componentWillMount");
        }
        // 组件加载完成
        componentDidMount() {
            console.log("child" + "componentDidMount");
        }
    
        // 接收到属性, 第一次不会执行,属性更新时才会执行
        componentWillReceiveProps () { 
            console.log("child" + "componentWillReceiveProps");
        }
        // 应该更新 属性:子组件判断接收的属性,是否满足更新条件,为 true 就更新
        shouldComponentUpdate(nextProps,nextState) {
            return nextProps.n % 3; // 只有是3 的倍数才更新
        }
    
        render () {
            console.log('child render');
            return (
                <div>
                    {this.props.n}
                </div>
            )
        }
    }