Zhi-Ling

You can do Everything you want

0%

Life-Cycle

Brief Intro: This article can tell you the difference between react15 and 16 in working cycle

React15

初始化阶段

  • constructor: 常用来初始化 State
  • componentWillMount: 通过 render 函数生成虚拟 DOM 之前触发,鸡肋
  • render: 通过 Diff 算法,生成新的虚拟 DOM
  • componentDidMount: 组件渲染完成之后触发,这里可以操作真实 DOM,也可以进行异步数据请求

更新阶段

  • 父组件更新触发的更新
  • 自身 State 改变触发的更新

卸载阶段

  • 执行 componentWillUnmount () 方法

shouldComponentUpdate

  • shouldComponentUpdate:这是 React 组件的钩子函数之一,该函数会在组件重新渲染之前调用,由函数的返回的 bool 值决定是否重新渲染组件。
  • React 已经提供了 React.PureComponent,来代替使用 shouldComponentUpdate 比对的方法,仅仅使用对 props 和 state 的 “浅比较” 来决定组件是否需要更新。
  • 注:大部分情况下,可以使用 React.PureComponent 来代替手写 shouldComponentUpdate,由于只是浅比较,对于数据结构足够复杂(比如对象或数组,修改其中某一个项的值或 push 一个值并不会触发更新),当然这种情况可以通过对 props 和 state 的正确使用来避免,使用 concat 或赋值一个新对象来触发重新渲染。

React16

初始化阶段对比

  • 去掉了 componentWillMount,新增了 getDerivedStateFromProps。
  • getDerivedStateFromProps 并不是用来代替 componentWillMount 方法的,它是用来替换 componentWillReceiveProps 的
  • getDerivedStateFromProps
    • getDerivedStateFromProps 是一个静态方法,声明的使用使用 static
    • getDerivedStateFromProps 接收两个参数,分别是父组件传递过来的 props 和自身的 state
    • getDerivedStateFromProps 必须返回一个对象格式的返回值,否则控制台会被警告

更新阶段对比

卸载阶段

同 React15

Hooks 和生命周期对应关系

constructor useState
getDerivedStateFromProps useState 里面 update 函数
shouldComponentUpdate useMemo
render 函数本身
componentDidMount useEffect
componentDidUpdate useEffect
componentWillUnmount useEffect 里面返回的函数
componentDidCatch
getDerivedStateFromError

Welcome to my other publishing channels