<!DOCTYPE html>
<html>
<head>
<meat charset="UTF-8">
<title>新旧react生命周期对比</title>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="test"></div>
<!-- 核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom,操作dom -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel,jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<!-- 此处一定要写babel -->
<script type="text/babel">
//1.创建组件
class Count extends React.Component{
/*
1.初始化阶段:由ReactDOM.render()触发---初次渲染
1.constructor()
2.componentWillMount()
3.render()
4.componentDidMount() =========>常用
做初始化的事,例如:开启定时器、发送网络请求、订阅消息
2.更新阶段:由组件内部this.setState()或父组件render触发
1.shouldComponentUpdate()
2.componentWillUpdate()
3.render() ====》必须使用的一个
4.componentDidUpdate()
3.卸载组件:由ReactDOM.unmountComponentAtNode()触发
1.componentWillUnmount() ====>常用
收尾,例如:关闭定时器,取消订阅消息
*/
//构造器
constructor(props){
console.log('Count---constructor');
super(props)
//初始化状态
this.state = { count: 0 }
}
//加1按钮的回调
add = ()=>{
//获取原状态
const {count} =this.state
//更新状态
this.setState({count: count+1})
}
death = ()=>{
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
//强制更新按钮的问题
force =()=>{
this.forceUpdate()
}
force
//组件将要挂载的钩子
UNSAFE_componentWillMount(){
console.log('Count---componentWillMount');
}
//组件挂载完毕的钩子
componentDidMount(){
console.log('Count---componentDidMount')
}
//组件将要卸载的钩子
componentWillUnmount(){
console.log('Count---componentWillUnmount')
}
//控制组件更新的‘阀门’
shouldComponentUpdate(){
console.log('Count---shouldComponentUpdate')
return false;
}
//组件将要更新的钩子
UNSAFE_componentWillUpdate() {
console.log('Count---componentWillUpdate')
}
//组件更新完毕的钩子
componentDidUpdate() {
console.log('Count---componentDidUpdate')
}
render(){
console.log('Count---render')
const {count}=this.state
return(
<div>
<h2>当前求和为:{count}</h2>
<button onClick={this.add}>点我+1</button>
<button onClick={this.death}>卸载组件</button>
<button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button>
</div>
)
}
}
//父组件A
class A extends React.Component{
//初始化状态
state = {carName:'奔驰'}
changeCar = ()=>{
this.setState({carName:'奥拓'})
}
render() {
return (
<div>
<div>我是A组件</div>
<button onClick={this.changeCar}>换车</button>
<B carName={this.state.carName}/>
</div>
)
}
}
//子组件B
class B extends React.Component {
//组件将要接收新的props的钩子
componentWillReceiveProps(props){
console.log('B---componentWillReceiveProps',props)
}
//控制组件更新的‘阀门’
shouldComponentUpdate() {
console.log('B---shouldComponentUpdate')
return true;//true才能往下走,看最后附上的图片,否则点击控制台一直是(数字+1)shouldComponentUpdate
}
//组件将要更新的钩子
componentWillUpdate() {
console.log('B---componentWillUpdate')
}
//组件更新完毕的钩子
componentDidUpdate() {
console.log('B---componentDidUpdate')
}
render() {
console.log('B---render')
return (
<div>我是B组件,接收到的车是:{this.props.carName}</div>
)
}
}
//2.渲染组件到页面
ReactDOM.render(<A/>, document.getElementById("test"));
</script>
</body>
</html>
==============
1.(上面代码是旧生命周期的)三个钩子需加上:UNSAFE_ name
否则控制台警告:
举一个例子图片:
============
总结:
旧生命周期废掉三个钩子:
componentWillMount
componentWillReceiveProps
componentWillUpdate
=============
- 新生命周期添加两个钩子:
-
getDerivedStateFromProps
-
getSnapshotBeforeUpdate
=============
- 附上新旧生命周期图片:
- 旧:
- 新: