生命周期(旧)版本
React 入门(三) 生命周期
📢 大家好,我是小超同学,这一篇是关于 React 的学习笔记,关于组件的生命周期 😊
📢 非常感谢你的阅读,不对的地方欢迎指正 🙏
📢 愿你生活明朗,万物可爱 😍
在 React 中为我们提供了一些生命周期钩子函数,让我们能在 React 执行的重要阶段,在钩子函数中做一些事情。那么在 React 的生命周期中,有哪些钩子函数呢,我们来总结一下
React的旧版生命周期
主要包括三个阶段:初始化阶段,更新阶段,销毁阶段
生命周期旧父子关系生命周期
初始化阶段挂载时 →
constructor
→componentWillMount
→render
→componentDidMount
setState()执行时→
shouldComponentUpdate
→componentWillUpdate
→render
→componentDidUpdate
forceUpdate执行时→
componentWillUpdate
→render
→componentDidUpdate
父组件render执行时→
componentWillReceiveProps
→shouldComponentUpdate
→componentWillUpdate
→render
→componentDidUpdate
constructor
在组件初始化的时候只会执行一次
通常它用于做这两件事
state
jsxconstructor(props) {
console.log('进入构造器');
super(props)
this.state = { count: 0 }
}
现在我们通常不会使用 constructor
属性,而是改用类加箭头函数的方法,来替代 constructor
例如,我们可以这样初始化 state
jsxstate = {
count: 0
};
graph TB
A["挂载阶段"]
A -- "constructor" --> B["构造函数"]
A -- "componentWillMount" --> C["组件即将挂载"]
A -- "render" --> D["渲染组件"]
A -- "componentDidMount" --> E["组件已挂载"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
这个图是组件的props或state改变总体图
graph TB
A["更新阶段"]
A -- "componentWillReceiveProps" --> B["组件将接收新的props"]
A -- "shouldComponentUpdate" --> C["判断是否应该更新组件"]
A -- "componentWillUpdate" --> D["组件即将更新"]
A -- "render" --> E["渲染组件"]
A -- "componentDidUpdate" --> F["组件已更新"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
linkStyle 4 stroke:#2ecd71,stroke-width:2px;
graph TB
A["props改变"]
A -- "componentWillReceiveProps" --> B["组件将接收新的props"]
B -- "shouldComponentUpdate" --> C["判断是否应该更新组件"]
C -- "componentWillUpdate" --> D["组件即将更新"]
D -- "render" --> E["渲染组件"]
E -- "componentDidUpdate" --> F["组件已更新"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
linkStyle 4 stroke:#2ecd71,stroke-width:2px;
graph TB
A["state改变"]
A -- "shouldComponentUpdate" --> B["判断是否应该更新组件"]
B -- "componentWillUpdate" --> C["组件即将更新"]
C -- "render" --> D["渲染组件"]
D -- "componentDidUpdate" --> E["组件已更新"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
graph TB
A["卸载阶段"]
A -- "componentWillUnmount" --> B["组件即将卸载"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
React的新版生命周期
主要包括三个阶段:初始化阶段,更新阶段,销毁阶段
graph TB
A["挂载阶段"]
A -- "constructor" --> B["构造函数"]
A -- "static getDerivedStateFromProps" --> C["从props获取派生state"]
A -- "render" --> D["渲染组件"]
A -- "componentDidMount" --> E["组件已挂载"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
graph TB
A["更新阶段"]
A -- "static getDerivedStateFromProps" --> B["从props获取派生state"]
A -- "shouldComponentUpdate" --> C["判断是否应该更新组件"]
A -- "render" --> D["渲染组件"]
A -- "getSnapshotBeforeUpdate" --> E["获取更新前的快照"]
A -- "componentDidUpdate" --> F["组件已更新"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
linkStyle 1 stroke:#2ecd71,stroke-width:2px;
linkStyle 2 stroke:#2ecd71,stroke-width:2px;
linkStyle 3 stroke:#2ecd71,stroke-width:2px;
linkStyle 4 stroke:#2ecd71,stroke-width:2px;
graph TB
A["卸载阶段"]
A -- "componentWillUnmount" --> B["组件即将卸载"]
linkStyle 0 stroke:#2ecd71,stroke-width:2px;
这个是 React 新版本中新增的2个钩子之一,据说很少用。
getDerivedStateFromProps
在初始化和更新中都会被调用,并且在 render
方法之前调用,它返回一个对象用来更新 state
getDerivedStateFromProps
是类上直接绑定的静态(static
)方法,它接收两个参数 props
和 state
props
是即将要替代 state
的值,而 state
是当前未替代前的值
注意:state 的值在任何时候都取决于传入的 props ,不会再改变
jsxstatic getDerivedStateFromProps(props,state) {
return props
}
ReactDOM.render(<Count count="109"/>,document.getElementById("example"))
count
的值不会改变,一直是 109
在最近一次的渲染输出之前被提交之前调用,也就是即将挂载时调用
相当于淘宝购物的快照,会保留下单前的商品内容,在 React 中就相当于是 即将更新前的状态
它可以使组件在 DOM 真正更新之前捕获一些信息(例如滚动位置),此生命周期返回的任何值都会作为参数传递给
componentDidUpdate()
。如不需要传递任何值,那么请返回 null
jsx //在更新之前获取快照
getSnapshotBeforeUpdate () {
console.log('Count---getSnapshotBeforeUpdate');
return 'atxuechao'
}
重要的钩子(工作中常用)
render
: 渲染方法,返回组件的虚拟DOM表示。componentDidMount
: 在组件首次渲染完成后调用,通常用于进行异步数据获取、axios请求、添加事件监听器等副作用操作。componentWillUnmount
:作一些收尾的工作(清除定时器)即将废弃的勾子
componentWillMount
: 即将废弃,在新版本React中不推荐使用。可以在constructor
中进行初始化操作。componentWillReceiveProps
: 即将废弃,在新版本React中不推荐使用。可以使用static getDerivedStateFromProps
或componentDidUpdate
来处理接收到的属性变化。componentWilUpdate
:即将废弃并由**getSnapshotBeforeUpdate
**取代。getSnapshotBeforeUpdate
用于在组件更新之前获取DOM快照,常用于在组件更新后恢复滚动位置或处理其他交互效果。本文作者:LiuXueChao
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!