Reac生命周期理解

167 阅读1分钟

react16之前的生命周期

16之前.png

组件初始化阶段

    constructor() { ... }

组件挂载阶段

    componentWillMount() { ... }
    render() { ... }
    componentDidMount() { ... }

组件更新阶段

props变化触发的更新

    componentWillReceiveProps(nextProps) { ... }
    shouldComponentUpdate(nextProps, nextState) { ... }
    componentWillUpdate(nextProps, nextState) { ... }
    componentDidUpdate(prevProps, prevState) { ... }

state变化触发的更新

    shouldComponentUpdate(nextProps, nextState) { ... }
    componentWillUpdate(nextProps, nextState) { ... }
    componentDidUpdate(prevProps, prevState) { ... }

组件卸载阶段

    componentWillUnmount() { ... }

react16之后的生命周期

16后.png

    static getDerivedStateFromProps(props, state)
  • getDerivedStateFromProps 是一个静态方法。静态方法不依赖组件实例而存在,因此你在这个方法内部是访问不到this的。若你偏要尝试这样做,必定报错。
  • 该方法可以接收两个参数:props 和 state,它们分别代表当前组件接收到的来自父组件的 props当前组件自身的 state
  • getDerivedStateFromProps 需要一个对象格式的返回值。如果你没有指定这个返回值,那么大概率会被 React 警告一番;getDerivedStateFromProps 的返回值之所以不可或缺,是因为 React 需要用这个返回值来更新(派生)组件的 state。否则一定记得给它 return 一个 null。getDerivedStateFromProps 方法对 state 的更新动作并非“覆盖”式的更新而是针对某个属性的定向更新。getDerivedStateFromProps只是更新state中的某一个属性,并不是直接覆盖原来的state对象,state中有这个属性就更新属性值,没有就直接新增该属性;state中其他属性和值不会发生改变。
    getSnapshotBeforeUpdate(prevProps, prevState) {
      // ...
    }
  • getSnapshotBeforeUpdate 的返回值会作为第三个参数给到 componentDidUpdate它的执行时机是在 render 方法之后,真实 DOM 更新之前。在这个阶段里,我们可以同时获取到更新前的真实 DOM 和更新前后的 state&props 信息