理解react生命周期,以及react生命周期的使用场景
前言:
在最初学习react的过程中,我对react的生命周期没有足够的重视,使得我在开发过程中遇到了很多问题。弄懂react的声明周期,可以让你的代码更加高效,更加优美。
什么是生命周期函数?
生命周期函数(钩子函数)通俗的说就是在某一时刻会被自动调用执行的函数。
react的生命周期可以分成四个部分:
props,state,render()函数:
1. render()函数会在props,state改变时触发。
2.子组件的render()函数会在父组件render()执行的时候被执行(这会导致一些性能问题,我们可以在子组件的componentshouldupdate函数中进行判断,优化性能)
在render(),创建虚拟dom,进行diff算法,更新dom树。
注意:不要在render中修改state,会导致死循环。
1.初始化
在这里可以初始化props,state
2.挂载
①:componentWillMount(): 注意:改生命周期在未来17版本中将被弃用(在这里请求异步数据,render可能不会渲染到,因为componentWillMount执行后,render立马执行)
组件被挂载到页面之前调用,整个生命周期中只会调用一次(组件更新时不会再调用)。
注意:在这里可修改state
②:componentDidMount():
组件被挂载到页面之后调用,整个生命周期只调用一次(组件更新不会调用)。
建议:在这里可以异步请求数据。在这里设置状态会触发重新渲染。但是不推荐在这里使用setState函数,它会触发一次额外的渲染,而且是在浏览器刷新屏幕之前执行,用户看不到这个状态。在这里使用setState函数会导致性能问题。
3.更新
new: getDerivedStateFromProps(nextProps,prevState)
新的静态
getDerivedStateFromProps生命周期在组件实例化以及接收新
props(
只要父组件重新渲染,那么这个props不论值是否一样都是一个新的props
)后调用。它可以返回一个对象来更新
state,或者返回null来表示新的
props不需要任何
state更新。
new:getSnapshotBeforeUpdate()
新的
getSnapshotBeforeUpdate生命周期在更新之前被调用(例如,在DOM被更新之前)。此生命周期的返回值将作为第三个参数传递给
componentDidUpdate。 (这个生命周期不是经常需要的,但可以用于在恢复期间手动保存滚动位置的情况。)
①: componentWillReceiveProps(nextprops): 注意:改生命周期在未来17版本中将被弃用
组件从父组件中接受了新的props
(
只要父组件重新渲染,那么这个props不论值是否一样都是一个新的props
),并且组件已经存在时调用。(组件初始化时候不调用)。
注意:可以根据属性的变化,通过调用this.setState()
来更新你的组件状态,旧的属性还是可以通过this.props
来获取,这里调用更新状态是安全的,并不会触发额外的render
调用
②: shouldComponentUpdate(nextprops,nextstate):
组件更新之前调用(组件接受新的props或者state)。函数会返回一个布尔值,true才会更新组件。
注意:最好判断一下新旧两个props/state是否相同,相同则返回false不要触发更新。这样就不用生成新的dom树和旧的进行diff算法对比,从而优化性能。(因为父组件render()调用会使得子组件render()也被执行,引起性能问题)
③:componentWillUpdate(nextprops,nextstate): 注意:改生命周期在未来17版本中将被弃用
组件更新之前(componentshouldupdate返回true)时调用,组件初始化时不调用
注意:在这里可以更改state,nextstate.xxx = xxx,但是在这里不能调用setState函数,这会导致函数调用componentshouldupdate从而进入死循环。
④:componentDidUpdate():
组件更新完成之后调用,组件初始化时候不调用。
注意:可以在这里获取dom
4.卸载
①:componentWillUnmount():
组件即将被卸载时执行
注意:在这里清除一些不需要的监听和计时器
阅读更多- 理解final static的使用场景以及具体含义
- Android中activity的生命周期以及使用场景
- Android的生命周期和启动模式以及使用场景
- static的生命周期,以及使用范围
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 如何理解、使用Android LogCat以及通过Monkey进行压力测试
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 加深C# 中字符串前加@符号理解以及使用~~
- Activity生命周期的学习以及Logcat的使用 (五)
- TWaver 3D 编辑器的使用(一)----设计3D场景以及数据绑定
- kill用法详细解释(特别是信号量9的使用以及理解)
- 加深C# 中字符串前加@符号理解以及使用~~
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- amor详解 二叉排序树的使用以及理解
- Objective-C下对象生命周期以及使用策略
- 加深C# 中字符串前加@符号理解以及使用~~
- ASP.NET生命周期中的验证以及身份验证模块(理解以后可以自定义验证方法)
- 加深C# 中字符串前加@符号理解以及使用~~
- 使用TFS2010管理敏捷项目生命周期-系列指南3 工作项跟踪,以及用VS2010,excel和web方式使用的区别
- asp.net 2.0生命周期 以及Page_Load Page_Init方法使用原理