本节主要讲
React
中非常重要的知识点:生命周期
。
1. React
生命周期图
通过这张图,可以看到React
生命周期的四大阶段:
-
Initialization
: 初始化阶段 -
Mounting
:挂载阶段 -
Updation
: 更新阶段 -
Unmounting
: 销毁阶段
2. 什么是生命周期函数?
一句话概括:生命周期函数指在某一时刻组件会自动调用执行的函数
举例说明:在Child,js
组件中。里面的render()
函数。就是一个生命周期函数它在state
发生改变时自动执行。这就是一个标准的自动执行函数
-
constructor
不算生命周期函数
constructor
是构造函数,它是ES6
的基本语法。它虽然和生命周期函数的性质一样,但不能认为是生命周期函数。但是我个人觉得在心里要把它当做一个生命周期函数,个人把它看成React
的Intialization
阶段,定义属性(props)
和状态(state)
2.1 Intialization
初始化阶段
其实这个阶段做的事情就是初始化。初始化属性props
和状态state
。
2.2 Mounting
挂载阶段
Mounting
阶段叫挂载阶段,伴随整个虚拟DOM
的声明。它里面有三个小的生命周期函数
,分别是:
-
componentWillMount
:在组件即将被挂载到页面的时候执行 -
render
:页面state
或props
发生变化时执行
`componentDidMount`:组件挂载完成之后执行
以下我们可以写一些代码来验证以下这3个阶段的执行顺序:
componentWillMount
代码
// 组件挂载之前
componentWillMount() {
console.log('componentWillMount --------- 组件挂载之前')
}
render
代码
render() {
console.log('render -------- 组件中')
}
componentDidMount
代码
// 组件挂载之后
componentDidMount() {
console.log('componentDidMount --------- 组件挂载之后')
}
这时候打开控制台会发现按照:组件挂载之前 -> 组件中 -> 组件挂载之后的顺序输出。
注意:componentWillMount
和 componentDidMount
这两个生命周期函数,只在页面刷新时执行一次,而 render
函数只要有state
和props
变化就要执行
2.3 Updation
更新阶段
Updation
会在组件发生改变的时候执行。是生命周期中比较复杂的一个部分,由两个部分组成:一个是props
属性改变,一个是state
状态改变
shouldComponentUpdate
函数
该函数会在组件更新之前,自动被执行。比如如下代码:
// 组件更新之前执行
shouldComponentUpdate() {
console.log('shouldComponentUpdate ------- 组件更新之前')
return true
}
它要求返回一个布尔类型的结果,必须有返回值,这里就返回了一个true
。
此时可以在控制台里查看结果了。并且结果是每次文本框发生改变时都会随着改变。如果返回了false
,这组件就不会更新了。简单来说。返回true
同意组件更新。反之则阻止组件更新。
componentWillUpdate
函数
该函数在组件更新之前,但shouldComponentUpdate
之后被执行,如果shouldComponentUpdate
返回false,那么该函数就不会被执行。
// 组件更新之前,shouldComponentUpdate函数之后执行。如果shouldComponentUpdate返回false,就不会执行该函数
componentWillUpdate() {
console.log('componentWillUpdate --------- 组件更新之前,shouldComponentUpdate函数之后')
}
componentDidUpdate
函数
该函数在组件更新之后执行,它是组件更新的最后一个环节。
// 组件更新之后执行。组件更新的最后一个环节
componentDidUpdate() {
console.log('componentDidUpdate --------- 组件更新之后')
}
此时,可以打开控制台看一下输出的变化
componentWillReceiveProps
函数
首先可以在Child.js
组件写下这个函数。如下代码:
componentWillReceiveProps() {
console.log('componentWillReceiveProps ---------')
}
此时打开控制台会发现函数并没有执行,其实是因为Child.js
是一个顶层组件,并没有接收任何props
,所以并没有执行。可以把这个函数移动到ChildItem.js
里之后再次查看效果。
凡是组件都有生命周期函数,所以子组件也有,并且子组件接收了props
,这个时候函数就可以被执行了。
componentWillReceiveProps
执行的时间是:子组件接收父组件传递过来的参数,父组件render
函数重新被执行,这个生命周期函数就会被执行
- 也就是说这个组件第一次存在于
DOM
中,函数是不会执行的; - 如果已经存在于
DOM
中,函数才会执行。
2.4 Unmounting
卸载阶段
该生命周期表示:组件在卸载阶段时执行。
componentWillUnmount
函数
这个函数是组件从页面中删除时执行,比如在ChildItem.js
中,写如下代码:
// 页面卸载时执行
componentWillUnmount() {
console.log('componentWillUnmount ----------- child')
}
写完之后可以去页面中点击删除某一项就会触发该函数。
以上就是React
中生命周期函数的介绍。