React学习-生命周期

183 阅读3分钟

生命周期

上图官网展示的,最新稳定的生命周期表,去除了即将失效的componentWillMountcomponentWillReceivePropscomponentWillUpdate


作为一个⚪还是很有必要去了解一下当前版本有效的生命周期的功能的

Initialization初始化阶段

  • 初始化stateprops,包括contructor内部初始化stateprops

Mounting 挂载阶段

componentWillMount

  • 在挂载之前被调用,它在render方法之前被调用,因此在这个函数里面使用setState来设置,是不会引起视图重新渲染的
  • 这个方法是服务端渲染唯一会调用的生命周期函数

render函数

  • 组件挂载阶段
  • render函数是一个纯函数(针对于相同的输入,一定能得到相同的输出,如reduce)
  • render应该尽量避免直接使用this.setState(可以放在条件判断),否则容易陷入死循环

componentDidMount

  • 在组件挂载完毕(插入DOM树中)会直接调用,这个时候DOM树已经完毕了,所以涉及到DOM的操作应该放到这个生命周期函数内。
  • 这个函数也是网络请求较好的位置
  • 可以在这个方法内使用setState来设置state,虽然会触发视图二次渲染,但是这个方法是发生在浏览器将视图更新到屏幕之前,所以在这里涉及到的二次视图渲染(render),用户是察觉不到的。当然这样做的后果就是会发生一些性能问题。

Updation 更新

这里的更新分为props和state的更新

props->componentWillReceiveProps(nextProps)

  • 会在接受的props发生改变的时候被调用.
  • 可以比较nextProps和当前props的区别
  • 只要父类导致组件重新渲染,即使子类的props没有发生改变,也会调用这个方法

shouldComponentUpdate

  • 可以根据shouldComponentUpdate的返回值,来判断组件返回值是否受propsstate的更改的影响。默认propsstate的改变都会导致组件重新渲染
  • 不建议在shouldComponentUpdate进行深层次的比较及JSON.stringify
  • 如果shouldComponentUpdate返回false,那么componentWillUpdaterender以及componentDidUpdate就不会执行,但这只是暂时的,可能随着版本更新就能够执行了
  • 仅仅是为了性能优化而使用,不要想着来阻止整个组件的渲染

componentWillUpdate

  • 当组件收到props或者state值的改变的时候,它就会在渲染之前被执行(初始渲染的时候不会执行这个生命周期)
  • 不能在这个函数内使用this.state

componentDidUpdate

  • 会在组件渲染完成之后执行
  • 可以在这个方法内进行网络请求,但是必须要进行props的比较进行
  • 在这个方法,可以使用this.setState,但是必须要包括在条件语句里面,否则会进行死循环

Unmounting 卸载

componentWillUnmount

  • 会在组件卸载或者被销毁的时候调用,在这个方法内部可以进行必要的清除操作,比如:定时器的清除,组件内部componentDidMount创建的订阅,取消网络请求

补充

错误处理

  • getDerivedStateFromError
  • componentDidCatch

生命周期取消之后的替代方法

juejin.cn/post/684490…