【React学习笔记】React生命周期梳理(16.X前后两种)
React生命周期
「16版本以前的:」
生命周期流程图
组件从生成到被挂在到页面上的一系列过程

根据流程图打印的执行顺序图:

流程讲解:
初始化流程
| start | 开始创建组件 | 在这个周期中做的事情 |
|---|---|---|
| 检查 | 检查组件中是否有默认的属性、是否有属性校验 | |
| constructor | 开始执行constructor构造函数 (讲解:constructor是生命周期的一部分。react.component就是一个抽象类,官方文档就是这么定义的。) |
构造类。在这里可以写一些状态 可以进行ajax数据请求 |
| componentWillMount | 执行componentWillMount生命周期函数。此时组件即将挂载到页面上。 (类似vue的beforeMounte) 会有关于componentWillMount更名的信息提示 ![]() |
可以进行ajax请求 「(但是react官方不建议。因为可能后期会使用react Native时会与之发生冲突。而且官方特强硬的把这个周期函数给移除了。16.3版本以后移除了)」 也可以setState一下 |
| render | 执行render函数渲染页面。 | 没必要进行ajax请求 「不能调用setState,否则会死循环。因为setState会触发shouldComponentUpdate,触发后如果返回true,又会走到render里。所以,render里只做数据渲染、展示就行,别进行setState」 |
| componentDidMount | 执行componentDidMount生命周期函数。此时组件已经被挂载到页面中。 (类似vue的mounted) |
可以发送ajax、设置状态(setState)的「最好的地方」 |
组件运行流程
state值被改变
| state被更改 | 组间运行中,state被更改 | |
|---|---|---|
| 进行提问 是否继续? |
触发「shouldComponentUpdate」函数。提问组件是否要进行更新。 该函数接收两个参数:nextProps、nextStates 该函数需要返回布尔值来「回答」是否更新: return false不更改 - 流程回到state被更改前。 return true进行更改 - state更改,流程继续。 |
可以在参数里边知道将要更新的值 「可以比较值,发现需要更改的值与更改前后一致时,返回false,不触发更新。」 因为react没有vue那么智能,不知道要更改的内容是否真的发生了改变。「只要setState就会触发更新、只要触发了更新就会走剩下的流程。还会去对比虚拟dom、耗费性能 。其内部的子组件的生命周期也会触发一遍。」 shouldComponentUpdate(nextProps,nextStates){ return nextStates.count !== this.state.count } |
| 【回答】:是 | ||
| componentWillUpdate | 执行conponentWillUpdate生命周期函数。告知组件即将开始进行更新。 | 千万不能设置状态,因为会又回到shouldComponentUpdate的死循环中。 没必要做ajax请求,即使做了也不能重新setState 基本上没什么用 |
| render | 组间更新完毕,执行render函数重新渲染页面。 | (同上边的render。) |
| componentDidUpdate | 执行componentDidUpdate生命周期函数。告知组件更新并渲染完毕。此时更新过的组件已经渲染到页面中。 | 千万不能设置状态,因为会又回到shouldComponentUpdate的死循环中。 没必要做ajax请求,即使做了也不能重新setState 基本上没什么用 |
| 【往复】:回到组件运行状态(等待) |
props改变,重新render
props属性是从父组件传过来的。当父组件改变了传递给子组件的数据时,子组件内部就会触发该函数。
以下流程发生在子组件内部:子组件内部
| componentWillReceiveProps | 执行componentWillReciveProps生命周期函数。告知父组件改变了props的值。 接受参数:nextProps 初始化不执行,只有当props改变时才会执行 |
可以进行状态的设置: 因为其可以接受一个参数nextProps,然后把参数的属性值setState到this.state身上 可以发送ajax请求: 同上 「但是官方不建议这么做,认为是不合理的。所以在16.3以后的版本中移除了,该函数不能使用了。」 |
|---|---|---|
| 【循环】:重走state值被更改的流程如下: | ||
| 进行提问 是否继续? |
触发shouldComponentUpdate函数。提问组件是否要进行更新。 该函数接收两个参数:nextProps、nextStates 该函数需要返回布尔值来「回答」是否更新: return false不更改 - 流程回到state被更改前。 return true进行更改 - state更改,流程继续。 |
|
| 【回答】:是 | ||
| componentWillUpdate | 执行conponentWillUpdate生命周期函数。告知组件即将开始进行更新。 | 「在16.3以后的版本中移除了」 |
| render | 组间更新完毕,执行render函数重新渲染页面。 | |
| componentDidUpdate | 执行componentDidUpdate生命周期函数。告知组件更新并渲染完毕。此时更新过的组件已经渲染到页面中。 | |
| 【往复】:回到组件运行状态(等待) |
组件被移除、销毁
| componentWillUnmount | 执行componentWillUnmount生命周期函数。告知即将销毁组件。 | 销毁组件前,可以先告知用户之类的。 |
|---|---|---|
| 【销毁】:组件销毁完毕。 |
代码演示:
见github (https://github.com/xingorg1/JuFengGuo/tree/master/advanceCourse/react/3-react_lifecycle/src/components/before_16.3)
生命周期钩子函数的功能:
每个生命周期都可以用来干什么?详见上述表格中各对应列
「16.3版本以后的:」
「基本把‘xxWillxxx’等,带“Will”的钩子函数都删掉了」
生命周期流程图
组件从生成到被挂在到页面上的一系列过程。

根据流程图打印的执行顺序图:

流程讲解:
初始化流程
| start | 开始创建组件 | 在这个周期中做的事情 |
|---|---|---|
| 检查 | 检查组件中是否有默认的属性、是否有属性校验 | |
| constructor | 开始执行constructor构造函数 (讲解:constructor是生命周期的一部分。react.component就是一个抽象类,官方文档就是这么定义的。) |
构造类。在这里可以写一些状态 可以进行ajax数据请求(要不要在constructor里获取数据) |
| static getDerivedStateFromProps(props,state) | 执行一个静态的方法。从属性中去获得状态**。** 「初始化就会执行」 「这样,更改state和更改props,就不会走两套路线了,而是都走这一个。」 「必须返回一个state的对象。否则报错如下」 Warning: Father.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined. 「return的返回值,就会放到组件的state状态中」 参数:props、state,就是当前组件的属性状态值和属性值 |
|
| render | 执行render函数渲染页面。 | 没必要进行ajax请求 「不能调用setState,否则会死循环。因为setState会触发shouldComponentUpdate,触发后如果返回true,又会走到render里。所以,render里只做数据渲染、展示就行,别进行setState」 |
| componentDidMount | 执行componentDidMount生命周期函数。此时组件已经被挂载到页面中。 (类似vue的mounted) |
可以发送ajax、设置状态(setState)的「最好的地方」 |
组件运行流程
state 或 props其中任意一个被改变后
| static getDerivedStateFromProps(props,state) | state或props更改,都会执行这个静态的方法。从属性中去获得状态**。** 「这样,更改state和更改props,就不会走两套路线了,而是都走这一个。」 「必须返回一个state的对象。否则报错如下」 Warning: Father.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined. |
|
|---|---|---|
| 进行提问 是否继续? |
触发shouldComponentUpdate函数。提问组件是否要进行更新。 该函数接收两个参数:nextProps、nextStates 该函数需要返回布尔值来「回答」是否更新: return false不更改 - 流程回到state被更改前。 return true进行更改 - state更改,流程继续。 |
可以在参数里边知道将要更新的值 「可以比较值,发现需要更改的值与更改前后一致时,返回false,不触发更新。」 因为react没有vue那么智能,不知道要更改的内容是否真的发生了改变。「只要setState就会触发更新、只要触发了更新就会走剩下的流程。还会去对比虚拟dom、耗费性能 。其内部的子组件的生命周期也会触发一遍。」 shouldComponentUpdate(nextProps,nextStates){ return nextStates.count !== this.state.count } |
| 【回答】:是 | ||
| render | 组件更新完毕,执行render函数重新渲染页面。 | (同上边的render。) |
| getSnapshotBeforeUpdate(prevProps,prevState) | 执行这个函数,获取之前状态的一个快照。 「需要有返回值。其返回值供下边的钩子函数componentDidUpdate中接受并使用。」 ![]() 「所以该函数必须和componentDidUpdate函数写在一起。」 |
|
| componentDidUpdate | 执行componentDidUpdate生命周期函数。告知组件更新并渲染完毕。此时更新过的组件已经渲染到页面中。 「可支持接受三个参数。分别是prevProps、prevState、snapShot」 「其中,snapShot是getSnapshotBeforeUpdate的返回值」 ** ![]() |
千万不能设置状态,因为会又回到shouldComponentUpdate的死循环中。 没必要做ajax请求,即使做了也不能重新setState 基本上没什么用 |
| 【往复】:回到组件运行状态(等待) |
组件被移除、销毁
| componentWillUnmount | 执行componentWillUnmount生命周期函数。告知即将销毁组件。 | |
|---|---|---|
| 【销毁】:组件销毁完毕。 |
代码演示:
见github (https://github.com/xingorg1/JuFengGuo/tree/master/advanceCourse/react/3-react_lifecycle/src/components/after_16.3)
生命周期钩子函数的功能:
每个生命周期都可以用来干什么?详见上述表格中各对应列
本文使用 mdnice 排版
【React学习笔记】React生命周期梳理(16.X前后两种)的更多相关文章
- Angular 5.x 学习笔记(2) - 生命周期钩子 - 暂时搁浅
Angular 5.x Lifecycle Hooks Learn Note Angular 5.x 生命周期钩子学习笔记 标签(空格分隔): Angular Note on cnblogs.com ...
- MVC学习笔记---MVC生命周期及管道
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- Java Web学习笔记-Servle生命周期
Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器停止的时候结束生命周期. 无论请求多少次Servlet,最多只有一个Servlet实例.多个客户端并发请求Servl ...
- android学习笔记 activity生命周期&任务栈&activity启动模式
activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...
- iOS学习笔记—ViewController/生命周期
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图.iOS的SDK中提供很多原生ViewController ...
- MVC学习笔记---MVC生命周期
Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率.因此在2007年和2008年我在这个话题上各写了一篇文章 ...
- Vue2学习笔记:实例生命周期
实例生命周期 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .在这个 ...
- VUE 学习笔记 二 生命周期
1.除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 var data = { a: 1 } var vm = new Vue({ el: ' ...
- Android学习笔记_18_Activity生命周期 及 跳转方式
一.Activity有三个状态: 1.当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态.它就是响应用户操作的Activity. 2. 当它上面有另外一个Activity,使它失去了焦点但 ...
- AngularJs学习笔记-组件生命周期
组件生命周期 (1)组件生命周期钩子 constructor:组件创建时被创建 ngOnChanges: 父组件修改或初始化子组件的输入属性时被调用,如果子组件没有输入属性,则永远不会被调用,它的首次 ...
随机推荐
- git添加所有新文件
git add -A 提交所有变化 git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) git add . 提交新文件(new)和被修改(mod ...
- LR字符串处理函数-lr_save_int
int lr_save_int(int value,const char * param_name); value:要分配给参数的整数值. param_name:参数的名称. lr_save_in ...
- 在windows上安装docker
开启Hyper-V 添加方法非常简单,把以下内容保存为.cmd文件,然后以管理员身份打开这个文件.提示重启时保存好文件重启吧,重启完成就能使用功能完整的Hyper-V了. pushd " ...
- cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据
cb09a_c++_顺序容器的操作2在顺序容器中添加元素vector不能向前插入数据,list可以用insertc.push_back(t);c.push_front(t);c.insert(p,t) ...
- 全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测
一.前言 抓包工具有很多,比如常用的抓包工具Httpwatch,通用的强大的抓包工具Wireshark.为什么使用fiddler?原因如下:1.Wireshark是通用的抓包工具,但是比较庞大,对于只 ...
- OS_页面置换算法:C++实现
一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...
- Python学习之准备工作
Python学习之准备工作 编程语言历史 在计算机硬件基础中我们大概介绍了一下计算机的发展历史.了解到在曾经有一段时期里计算机是不存在操作系统这一概念的,所有需要计算机完成的操作都需要当时的程序员来与 ...
- web如何测试
当我们负责web测试的时候,先了解B/S架构,然后分析如何开始执行测试,一般步骤:从功能测试,兼容测试,安全测试. 功能测试: 一.链接测试,链接是web应用系统的一个很重要的特征,主要是用于页面之间 ...
- 用JS实现改变文本框的只读属性
<input id="aaa" readonly><input id="bbb" readonly> <script>doc ...
- Python 实现短信轰炸机
原理其实很简单,就是利用selenium包打开各种网站的注册页,输入轰炸的号码,实现轰炸.其实也算是利用了注册漏洞.申明:仅娱乐使用,禁止️用于非法用途!若用于非法用途,后果及法律责任博主一律不承担 ...


