React新旧版本生命周期对比

最近在学习React生命周期,笔记记了一堆,越记越乱(-.-),于是做个图帮助自己理解,先后顺序基本都自己验证过,有错误或补充的欢迎底下评论~

参考了:https://zhuanlan.zhihu.com/p/392532496、https://www.jianshu.com/p/b331d0e4b398、https://www.cnblogs.com/qianxiaox/p/13825985.html、https://www.bilibili.com/video/BV1dP4y1c7qd?p=54

image-20220421153201168

下面这些只是自己的听课笔记,不够专业,随便看看哈。

初始化/挂载阶段

  • [x]componentWillMount()
  • render():渲染组件,可访问props和state。不能直接修改状态,否则进入死循环,如图可见,改变状态后都会重新从上面开始走,到了render后又改状态了,又上去了。
  • componentDidMount():挂载完毕。组件一辈子也就这一次。此时DOM已生成,可以使用那些依赖DOM的插件啦~也可以axios进行一些初始化

更新阶段

  • [x]componentWillReceiveProps(nextProps):最先获取父组件传来的属性。可对比新旧属性nextProps和this.props;主要应用时根据父组件的props更改组件自身的state,与vue中的computed有一些相似。(*被遗弃的原因是过于敏感了,即使父组件更新的状态自己不用,它也要调用一次。)

  • [x]componentWillUpdate(nextProps,nextState)

  • shouldComponentUpdate(nextProps,nextState):根据更新的props或state判断要不要重新渲染。通过this.props和this.state可获取老属性和老状态,经过对比后返回布尔值,决定要不要重新渲染。对于复杂的状态或属性,可在JSON.stringify()之后再对比。(*性能优化必备)

  • componentDidUpdate(prevProps,prevState,value):在这里进行异步请求的时候,如果该请求的处理操作有setstate,那么会一直循环,所以需要在开头先判断新老请求是否一致(如传过来的属性或状态是否一致),一致则return不进行请求。


  • static getDerivedStateFromProps(nextProps,nextState):初始化或setState时,通过return{}合并原状态。配合componentDidUpdate进行异步请求,取代了componentWillMount、componentWillReceiveProps、componentWillUpdate。
  • getSnapShotBeforeUpdate():在render之后记录历史状态。比如在新DOM插入之前记录滚动距离,return值之后,配合componentDidUpdate(prevProps,prevState,value)进行操作,值将保存在第三个属性value中。

销毁阶段

  • componentWillUnmount():window窗口的事件监听、倒计时等不会因为dom消失而销毁,需要在这里将事件清空。
posted @ 2022-04-21 15:15  sanhuamao  阅读(164)  评论(0编辑  收藏  举报