图片来自:https://segmentfault.com/a/1190000016494335
1、如图所示,组件一开始会调用constructor函数,进行state以及props的初始化赋值。
2、随后进入componentWillCount,componentWillCount只在第一次render前调用。
3、在第一次render,即初始化render后,调用componentDidMount。
4、当运行期间,props发生变化时,调用componetWillReciveProps,在render前调用。
5、随后调用shouldComponentUpdate,该方法如果返回false,可以阻止组件渲染。通过条件判断,可以减少重复渲染。
6、之后,调用componentWillUpdate方法,通知即将开始渲染更新,在render前。
7、render完成后,调用componentDidUpdate方法,通知组件属性更新完成。
8、组件销毁,则调用componentWillUnMount,此方法中可以释放一些定时器,避免内存泄露。
示例代码:
实例代码来自:菜鸟教程React 组件生命周期
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>React 实例</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
class Button extends React.Component{
constructor(props) {
super(props);
this.state = {data: 0};
this.setNewNumber = this.setNewNumber.bind(this);
}
setNewNumber() {
this.setState({data: this.state.data + 1})
}
render() {
return (
<div>
<button onClick = {this.setNewNumber}>INCREMENT</button>
<Content myNumber = {this.state.data}></Content>
</div>
);
}
}
class Content extends React.Component{
componentWillMount() {
alert('Component WILL MOUNT!')
}
componentDidMount() {
alert('Component DID MOUNT!')
}
componentWillReceiveProps(newProps) {
console.log('Component WILL RECEIVE PROPS!')
}
shouldComponentUpdate(newProps, newState) {
return true;
}
componentWillUpdate(nextProps, nextState) {
alert('Component WILL UPDATE!');
console.log('Component WILL UPDATE!');
}
componentDidUpdate(prevProps, prevState) {
alert('Component DID UPDATE');
console.log('Component DID UPDATE!')
}
componentWillUnmount() {
alert('Component WILL UNMOUNT!');
console.log('Component WILL UNMOUNT!');
}
render() {
return (
<div>
<h3>{this.props.myNumber}</h3>
</div>
);
}
}
ReactDOM.render(
<div>
<Button />
</div>,
document.getElementById('example')
);
</script>
</body>
</html>