React新旧版本生命周期对比
最近在学习React生命周期,笔记记了一堆,越记越乱(-.-),于是做个图帮助自己理解,先后顺序基本都自己验证过,有错误或补充的欢迎底下评论~
下面这些只是自己的听课笔记,不够专业,随便看看哈。
初始化/挂载阶段
- [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消失而销毁,需要在这里将事件清空。