
Mounting:当页面打开时,执行mount生命周期钩子
1.componentWillMount
* 在组件即将被挂载到页面时,自动执行
2.componentDidMount
* 组件被挂载到页面之后,自动执行

Updating:页面中state或者子组件props被更新时执行
1.shouldComponentUpdate
* 组件被更新之前,会自动执行;
* 需要return一个布尔类型的值;
* 返回 true执行更新,false不执行更新;
shouldComponentUpdate(){
console.log('update-1.shouldComponentUpdate')
return true;
}
2.componentWillUpdate
* 组件被更新之前,shouldComponentUpdate之后执行;
* 如果shouldComponentUpdate返回true执行;
* 如果shouldComponentUpdate返回false则不执行;
3.componentDidUpdate
* 组件更新完成后,自动执行
4.componentWillReceiveProps
* 组件从父组件接收参数props
* 父组件render被重新执行后
* 子组件的componentReceiveProps就会被执行
* 重要:
* 如果这个组件第一次出现在父组件中,componentReceiveProps不会被执行
* 如果这个组件已经存在于父组件中,componentReceiveProps才会被执行
* 顶级父组件没有接收props参数,不会执行

如上图demo中数字组件已经出现在页面中,控制台输出子组件的componentReceiveProps生命周期钩子打印。

首次点击+1时数字组件才会出现,此时控制台没有输出componentReceiveProps生命周期打印。
Unmounting
componentDidUpdate
* 组件被剔除页面时执行

React16废弃了哪些生命周期?为什么?
React16废弃的生命周期有3个will:
componentWillMount componentWillReceiveProps componentWillUpdate
废弃的原因:
在React16的Fiber架构中,调和过程会多次执行will周期,不再是一次执行,失去了原有的意义。
此外,多次执行,在周期中如果有setState或dom操作,会触发多次重绘,影响性能,也会导致数据错乱。
DEMO:
父组件Lifecycle:
import { Component } from "react";
import ShowNum from './ShowNum'
class Lifecycle extends Component {
constructor(props){
super(props)
this.state = {
showNum: false,
num: 0,
str: ''
}
this.add = this.add.bind(this);
this.updateStr = this.updateStr.bind(this);
this.removeNum = this.removeNum.bind(this);
console.log('1.我是构造函数 constructor');
}
render(){
console.log('3.render')
return (
<div>
<p>react生命周期</p>
{
this.state.showNum ? <ShowNum num={this.state.num}></ShowNum>: ''
}
<h3>{this.state.str}</h3>
<p><button onClick={this.add}>数字加1</button></p>
<p><button onClick={this.removeNum}>移除num子组件</button></p>
</div>
)
}
removeNum(){
this.setState(() => ({showNum: false}))
}
updateStr(){
this.setState(prevState => {
return {
str: '我被更新了'
}
})
}
add(){
this.setState(prevState => {
return {
showNum: true,
num: ++prevState.num
};
})
}
// 在组件即将被挂载到页面时,自动执行
componentWillMount(){
console.log('2.componentWillMount, 将要废弃')
}
// 组件被挂载到页面之后,自动执行
componentDidMount(){
console.log('4.componentDidMount')
}
// 组件被更新之前,会自动执行,
// 需要return一个布尔类型的值
// 返回 true执行更新,false不执行更新
shouldComponentUpdate(){
console.log('update-1.shouldComponentUpdate')
return true;
}
// 组件被更新之前,shouldComponentUpdate之后执行;
// 如果shouldComponentUpdate返回true执行
// 如果shouldComponentUpdate返回false则不执行
componentWillUpdate(){
console.log('update-2.componentWillUpdate, 将要废弃');
}
// 组件更新完成后,自动执行
componentDidUpdate(){
console.log('update-3.componentDidUpdate');
}
// 父组件没有接收props参数,所以不会执行
componentWillReceiveProps() {
console.log('父组件-componentWillReceiveProps, 将要废弃');
}
}
export default Lifecycle;
子组件ShowNum:
import { Component } from "react";
class ShowNum extends Component {
render(){
let { num } = this.props;
return (
<h1>{num}</h1>
)
}
/**
* 组件从父组件接收参数props
* 父组件render被重新执行后
* 子组件的componentReceiveProps就会被执行
* 重要:
* 如果这个组件第一次出现在父组件中,componentReceiveProps不会被执行
* 如果这个组件已经存在于父组件中,componentReceiveProps才会被执行
*/
componentWillReceiveProps(){
console.log('子组件-componentReceiveProps, 将要废弃');
}
// 组件被剔除页面时执行
componentWillUnmount(){
console.log('子组件-componentWillUnmount');
}
}
export default ShowNum;