React 生命周期及使用场景
对比版本:16.4.0 VS 16.3.0 VS 16.2.0
发现最近几次React版本更改比较大,在为17.0的大版本作准备。总结了一下React生命周期函数的变化。
综合对比图如下:

各版本分别如下:



各生命周期函数使用场景:
1. Constructor(props)
使用场景:初始化局部State或把方法的句柄绑定到实例
注意:第一个语句必须是super(props)
2. GetDerivedStateFromProps(props,state)
使用场景:内部state变化依赖于props时,
注意:不要过度使用该函数。
如果你的操作依赖于props的更改并有副作用,最好放到ComponentDidUpdate中;
如果需要根据props的改变更新某些数据,最好使用memoization或Reselect做缓存处理;
如果你想根据props的改变重置state的值,使用全受控组件或带key的非受控组件,demo
3. ComponentWillMount - Legacy
使用场景:遗留函数,在16.3以后不应该再使用。
注意:由于该函数在render之前调用,因此使用同步的setstate方法不会触发额外的render处理。
尽量使用constructor函数实现同样效果
如果是处理带有后续操作或有副作用或订阅事件的处理,放到ComponentDidMount中。
4. componentWillReceiveProps(nextProps) - Legacy
使用场景:遗留函数,在16.3以后不应该再使用。
组件将要接收新的props时被调用
当props改变需要相应改变内部state时使用该函数。
注意:如果父组件强制子组件更新,即使props没有改变也会调用该函数
总是比较this.props 和 nextProps来确认是否需要调用setState。
5. shouldComponentUpdate(nextProps, nextState)
使用场景:性能优化接口
通过比较this.props与nextProps, 和比较this.state 与 nextState 来返回false阻止组件render
注意:forceUpdate不会触发该函数
某些情况可以使用React.PureComponent替代写该函数,参考Here
返回false并不会阻止子组件的重新render(如果他们的state改变的时候)
6. ComponentWillUpdate(nextProps, nextState) - Legacy
使用场景:遗留函数,在16.3以后不应该再使用。
注意:不能在该函数中通过this.setstate再次改变state,如果需要,则在componentWillReceiveProps函数中改变
7. Render
使用场景:核心函数,必不可少。返回类型包括:react元素/数组或代码片段/入口/字符串或数字/bool或空。
注意:不能在render函数中调用setState。
在存活周期中,如果shouldUpdateComponent返回false,该方法不会被调用。
8. getSnapshotBeforeUpdate(prevProps, prevState)
使用场景:该函数在最终render结果提交到DOM之前被调用
记录DOM刷新前的特性,如:滚动位置
注意:该函数的返回值会作为参数传递给ComponentDidUpdate
9. ComponentDidMount
使用场景:真是DOM被更新之后调用
在创建组件周期,该函数是异步请求的最佳接口,用以加载数据,AJAX/Fetch/redux-dispatch
注意:这里也是产生性能问题最多的地方(因代码问题)
10. ComponentDidUpdate(prevProps, prevState, snapshot)
使用场景:通过比较prevProps或prevState 与 this.props或this.state,进行业务处理,发送网络请求
注意:在处理业务或发送网络请求时,一定要做条件比较,否则容易造成死循环
11. ComponentWillUnmount
使用场景:组件销毁时调用
清理无效timer;取消未完成的网络请求;清理已注册的订阅
注意:在这里setState是无效的
12. componentDidCatch()
使用场景:任何子组件的JS错误或异常发生时触发
初始化周期和运行时周期的错误都会触发该函数
注意:只捕获该组件的所有子组件异常,并不会捕获本身的异常
在该函数中调用setState以实现错误回滚至前一页面
不要使用该函数作为业务处理的一部分。
refs:
https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
https://blog.csdn.net/zrcj0706/article/details/78608740
React 生命周期及使用场景的更多相关文章
- React生命周期
在react生命周期中,分2段执行,一个挂载的生命周期,一个是组件发生了数据变动,或者事件触发而引发的更新生命周期. 注:react生命周期很重要,对于很多组件场景的应用发挥重要作用,而且不熟悉生命周 ...
- JavaScript是如何工作的:Service Worker的生命周期及使用场景
摘要: 理解Service Worker. 原文:JavaScript 是如何工作的:Service Worker 的生命周期及使用场景 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...
- 4.React生命周期
4.React生命周期 4.1引出生命周期 class Life extends React.Component { state = { opacity:0.5 } death = () => ...
- React 生命周期
前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1.g ...
- React生命周期详解
React生命周期图解: 一.旧版图解: 二.新版图解: 从图中,我们可以清楚知道React的生命周期分为三个部分: 实例化.存在期和销毁时. 旧版生命周期如果要开启async rendering, ...
- React生命周期简单详细理解
前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1.g ...
- 22.1 、react生命周期(一)
在每个react组件中都有以下几个生命周期方法~我们需要在不同阶段进行讨论 组件生命周期概述 1.初始化 在组件初始化阶段会执行 constructor static getDerivedStateF ...
- react 生命周期钩子里不要写逻辑,否则不生效
react 生命周期钩子里不要写逻辑,否则不生效,要把逻辑写在函数里,然后在钩子里调用函数,否则会出现问题.
- react复习总结(2)--react生命周期和组件通信
这是react项目复习总结第二讲, 第一讲:https://www.cnblogs.com/wuhairui/p/10367620.html 首先我们来学习下react的生命周期(钩子)函数. 什么是 ...
随机推荐
- NHibernate4使用Oracle.ManagedDataAccess.dll连接oracle及配置多个数据库连接
NHibernate数据库配置参数在hibernate.cfg.xml中 <?xml version="1.0" encoding="utf-8"?> ...
- VMware三种网络介绍
前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识.(博文原创自http ...
- Flask开发基础
Flask是一个使用Python编写的轻量级Web应用框架. 模板引擎使用的Jinja2 Flask框架简单易学,但是其保留了扩展的弹性,可以使用Flask-extension 加入ORM ,窗体验证 ...
- logback-MDC日志唯一标识
自定义LogbackFilter: import org.slf4j.MDC; import javax.servlet.*; import javax.servlet.annotation.WebF ...
- Axure10种非交互功能简介(引自人人都是产品经理)
一.notes:控件和页面注释 越来越多的PM开始用Axure来写PRD,但行内并不存在约定成俗的文档规范.作者目前为止见过的Axure版PRD中,大部分采用原型+旁边文字标注的方法来表达产品逻辑.其 ...
- React Native - 网页组件(WebView)的使用详解
一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍. 1,属性介绍 source: ...
- vue-cli的使用(模板自定义、本地配置,eslint的配置)
vue-cli(脚手架工具:帮助开发者完成基本的代码编写). 功能: 目录结构 本地调试 代码部署 热加载 单元测试 使用模板: vue init <template-name> < ...
- python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法
在ide中执行python程序,都已经在默认的项目路径中,所以直接执行是没有问题的.但是在cmd中执行程序,所在路径是python的搜索路径,如果涉及到import引用就会报类似ImportError ...
- 关于使用 myeclipse连接MySql的问题
配置Hibernate.cfg.xml测试连接Mysql数据库时老是报错,如下图: 想想这样配置也没有错啊,可是一直测试连接不上.后面上查了一下,需要在连接字符串后面加上?serverTimezone ...
- latex如何定义宏,插图统一尺寸减少工作量
问题背景是这样的,因为我要在文中插入一系列的图片,但是这些图片的大小我要保持一致,来达到预期的效果. 比如我有三个figure,这三个figure中,每个figure里面有两行,5列图片,我想要的是, ...