❤React-组件的新旧生命周期
1、组件的生命周期概述.
👉生命周期
含义:
从组件出生到更新、改变、销毁(创建\更新\销毁)的整个阶段。
👉生命周期的钩子函数
含义:
组件的每个阶段都伴随着一些方法,就是生命周期的钩子函数,我们就是通过控制这些生命周期函数从而控制组件。
👉生命周期
意义:
组件的生命周期有助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因
👉TIPS
只有类组件才有生命周期
2、 组件生命周期的三个阶段
1.每个阶段的执行时机
2、每个阶段钩子函数的执行顺序
3、每个阶段钩子函数的作用
👉主要阶段
组件的生命周期主要分为三个主要阶段:
挂载(Mounting)、
更新(Updating)、
卸载(Unmounting)
生命周期图
👉 创建时
- 创建时(挂载阶段)
执行顺序:
👉钩子函数
钩子函数 | 触发时机 | 作用 |
---|---|---|
constructor | 创建组件时,最先执行 | 1. 初始化 state 2. 为事件处理程序绑定 this |
render | 每次组件渲染都会触发 | 1. 渲染 UI(注意:不能调用 setState() ) |
componentDidMount | 组件挂载(完成 DOM 渲染)后 | 1. 发送网络请求 2. DOM 操作 |
👉使用示例
👉更新时
更新的三种情况
- 说明:以上三者任意一种变化,组件就会重新渲染。
执行顺序
钩子函数 | 触发时机 | 作用 |
---|---|---|
render() | 每次组件渲染都会触发 | 渲染 UI(与挂载阶段是同一个 render ) |
componentDidUpdate() | 组件更新(完成 DOM 渲染)后 | 1. 发送网络请求 2. DOM 操作 注意:如果要 setState() ,必须放在一个 if 条件中 |
👉使用示例
组件的函数周期
render 生命周期渲染 componenetDidUpdate() 生命周期更新
注意部分:
seState 应该放在判断if 里面ajax的请求部分应该放在这里
👉组件卸载时(卸载阶段)
执行时间:组件从页面之中消失时
钩子函数 | 触发时机 | 作用 |
---|---|---|
componentWillUnmount | 组件卸载(从页面中消失) | 执行清理工作(比如:清理定时器等) |
- componentDidMount(){}组件的挂载阶段
- componentWillUnmount(){}组件的卸载阶段
组件的挂载阶段执行的一些方法可以在组件的卸载阶段除去
3、旧版本-生命周期钩子函数(react 15 可直接跳过)
我们可以来看看React15 的生命周期函数
(1)constructor()
: ES6 类中的构造函数,初始化使用(比如初始化组件状态(state)绑定事件处理器;),组件实例化时调用
(2) componentWillReceiveProps()
: 一般使用都是传值 componentWillReceiveProps(nextProps)
- 已废弃:这个生命周期函数就是在组件即将接收新的属性时被调用(旧版本React中就是更新用)。可以在这里比较新旧属性,然后更新组件的状态;
(3)shouldComponentUpdate(nextProps, nextState)
: 组件接收到新的属性或者状态时,在更新组件之前调用 shouldComponentUpdate()
函数。
根据新的属性和状态判断是否需要重新渲染组件(性能优化常用)
(4)componentWillMount()
:
- 已废弃:新版本不再推荐使用。 在组件即将被挂载到 DOM 中时被调用,很多时候我们可以使用
constructor()
或者componentDidMount()
来替代。
(5)componentWillUpdate(nextProps, nextState)
: 已废弃:新版本不再推荐,在组件即将被更新之前被调用,我们可以在组件即将更新之前控制组件。
(6)componentDidUpdate()
: 组件第一次被渲染到 DOM 中之后被调用。我们可以进行一些初始化的操作,获取远程数据、订阅事件等
(7)render()
: render()
最重要
的生命周期函数之一,返回虚拟 DOM 元素,渲染组件外观和结构.
(8)componentWillUnmount()
: 在组件即将被销毁和从 DOM 中移除之前被调用,就类似砸门在vue销毁之前一样,可以取消订阅、清除定时器。
4、重要
- 新版本-生命周期钩子函数(react 16 )
(1) constructor
在类组件创建实例时调用,初始化的时候执行一次,可以在组件进行初始化时候控制组件。
不定义 constructor
,React 会自动为组件创建一个默认的 constructor
我们来写一个简单的类组件
看看
作用
(2) getDerivedStateFromProps (react 16 新增)
组件更新执行包括(props变化,setState、forceUpdate)
注意点
getDerivedStateFromProps 被定义为 static 方法 —— static 方法内部拿不到组件实例的 this
任何操作 this.fetch()之类的都不可以在里卖面使用
在组件的操作之中大致归为两类
- 基于 props 更新状态
- 控制内部状态
(3 )render
渲染时操作元素
(4)componentDidMount
(5)shouldComponentUpdate
就是判断是否需要重新渲染组件,主要依赖传入的props 或 state 来决定是否更新组件
(6)getSnapshotBeforeUpdate
组件更新 DOM 之前被调用(如滚动位置的使用)
注意点:
getSnapshotBeforeUpdate
必须与componentDidUpdate
一起使用,因为它的返回值会作为第三个参数传递给componentDidUpdate
。- 我们在大多数情况下不使用,它主要用于处理一些处理复杂的 UI 动画或需要手动保存和恢复某些 DOM 状态的情况。
(7)componentDidUpdate
组件更新(re-render)完成之后被调用
(8) componentWillUnmount
组件销毁阶段唯一执行的生命周期
componentDidMount 设置定时器,componentWillUnmount清楚定时器
输出结果:
刷新以后组件重新销毁创建定时器
6、(函数式组件)React声明周期函数
需要注意的是:
React函数式组件中,没有像类组件那样明确的声明周期函数,可以通过 React Hooks实现类似的生命周期函数
常用的 React Hooks 及其对应的生命周期函数
Hooks 都可以帮助我们在函数式组件中实现类似于类组件的生命周期函数的功能