生命周期
上图官网展示的,最新稳定的生命周期表,去除了即将失效的componentWillMount和componentWillReceiveProps、componentWillUpdate
作为一个⚪还是很有必要去了解一下当前版本有效的生命周期的功能的
Initialization初始化阶段
- 初始化
state和props,包括contructor内部初始化state和props
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的返回值,来判断组件返回值是否受props和state的更改的影响。默认props和state的改变都会导致组件重新渲染 - 不建议在
shouldComponentUpdate进行深层次的比较及JSON.stringify - 如果
shouldComponentUpdate返回false,那么componentWillUpdate和render以及componentDidUpdate就不会执行,但这只是暂时的,可能随着版本更新就能够执行了 - 仅仅是为了性能优化而使用,不要想着来阻止整个组件的渲染
componentWillUpdate
- 当组件收到
props或者state值的改变的时候,它就会在渲染之前被执行(初始渲染的时候不会执行这个生命周期) - 不能在这个函数内使用
this.state
componentDidUpdate
- 会在组件渲染完成之后执行
- 可以在这个方法内进行网络请求,但是必须要进行
props的比较进行 - 在这个方法,可以使用
this.setState,但是必须要包括在条件语句里面,否则会进行死循环
Unmounting 卸载
componentWillUnmount
- 会在组件卸载或者被销毁的时候调用,在这个方法内部可以进行必要的清除操作,比如:定时器的清除,组件内部
componentDidMount创建的订阅,取消网络请求
补充
错误处理
- getDerivedStateFromError
- componentDidCatch