react常用生命周期(React中生命周期的讲解)
导读:什么是生命周期? 从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期。 React中的组件也是这么一个过程。 React的生命周期分为三个阶段:挂载期(也叫实例化期)、更新期(也叫存在期)、卸载期(也叫销毁期)。 在每个周期中React都提供了一些钩子函数。...
什么是生命周期?
从出生到成长 ,最后到死亡 ,这个过程的时间可以理解为生命周期 。
React中的组件也是这么一个过程 。
React的生命周期分为三个阶段:挂载期(也叫实例化期) 、更新期(也叫存在期) 、卸载期(也叫销毁期)。
在每个周期中React都提供了一些钩子函数 。
生命周期的描述如下:
挂载期:一个组件实例初次北创建的过程 。
更新期:组件在创建后再次渲染的过程 。
卸载期:组件在使用完后被销毁的过程 。
创建阶段(挂载阶段)
创建阶段(挂载阶段)
1==> constructor(){}
<!-- 触发时机:创建组件,作用:初始化state中的数据 , 可以为事件绑定this -->
2==>render(){}
<!-- 触发时机:每次组件渲染(初次渲染组件和更新组件)都会被触发 ,;作用是渲染UI; 注意不能够调用 setState
为什么不能够在 render中使用 setState;因为setState会更新数据 ,这样会导致递归渲染数据 。
-->
3==>componentDidMount(){}
<!-- DOM已经渲染完成了;可以进行DOM操作和网络请求
如果你在 constructor 和 render中获取DOM节点 ,得到的结果是null;
-->
更新阶段
更新阶段
有三种情况会导致组件的更新-触发render函数;
1. 组件接收到一个新的属性 ,会进行渲染 。-触发render函数
2. 调用setState()组件会跟新 。-触发render函数
3. 调用forceUpdate()方法会跟新组件 。-触发render函数
上面这三种方法会触发render(){}函数
更新阶段先触发
1==> render函数
2==> 然后就是componentDidUpdate[当组件中的数据跟新完成后会触发]
第一种[组件接收到一个新的属性]-触发render函数
下面这个例子是 ,我们给组件赋值了props;
组件触发了render函数这个生命周期
父组件
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
state = {
num:1
}
addHandler = () => {
this.setState({
num:10
})
}
render() {
return (
<div>
<button onClick={this.addHandler}>大豆豆</button>
<ClassCom showNum={this.state.num}></ClassCom>
</div>
)
}
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
子组件
import React from "react";
class ClassCom extends React.Component{
constructor(props) {
super(props)
console.warn(子组件-声明周期钩子函数: constructor )
}
render() {
console.warn(子组件-声明周期钩子函数: render )
return (
<div>
<h2>我是组件</h2>
<p>我展示的声明周期钩子函数</p>
<p>显示的数量 { this.props.showNum }</p>
</div>
)
}
componentDidMount() {
console.warn(子组件-声明周期钩子函数: componentDidMount )
}
}
export default ClassCom
第二种[调用setState()组件会跟新]-触发render函数
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
state = {
num:1
}
addHandler = () => {
this.setState({
num:this.state.num
})
}
render() {
console.log(调用setState()组件会跟新-会触发render函数)
return (
<div>
<p> 豆豆的数量是: { this.state.num }</p>
<button onClick={this.addHandler}>大豆豆</button>
</div>
)
}
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
第三种调用forceUpdate会触发render
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
addHandler = () => {
// 强制跟新数据;会触发render函数
this.forceUpdate()
}
render() {
console.log(调用setState()组件会跟新-会触发render函数)
return (
<div>
<button onClick={this.addHandler}>强制更新</button>
<p>我是内容 ,点击按钮 ,会触发render这个生命周期</p>
</div>
)
}
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
componentDidUpdate 的触发时机
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
state = {
num:1
}
addHandler = () => {
// 强制跟新数据
this.forceUpdate()
}
render() {
console.log(调用setState()组件会跟新-会触发render函数)
return (
<div>
<button onClick={this.addHandler}>强制更新</button>
</div>
)
}
componentDidUpdate() {
console.warn(组件已经更新完成)
}
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
componentDidUpdate 钩子函数中
如果要调用:1.setState()更新状态或2.者网络请求 。
必须包放一个if语句;否者会导致递归更新;
因为调用 setState会触发render函数;render触发后 ,就会触发componentDidUpdate;
这样就导致了-递归更新
所以我们要放置一个判断语句;不让他出现递归更新就可以了
比较更新前后的数据是否一样。如果一样就不进行更新了 。
componentDidUpdate(prevProps) { } 表示子组件已经更新完毕
prevProps中可以获取上一个props的值
componentDidUpdate函数参数prevProps的使用
父组件
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
state = {
num:1
}
addHandler = () => {
this.setState({
num:this.state.num+10
})
}
render() {
return (
<div>
<button onClick={this.addHandler}>增加</button>
<ClassCom showNum={ this.state.num }></ClassCom>
</div>
)
}
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
子组件
import React from "react";
class ClassCom extends React.Component{
render() {
return (
<div>
<h2>我是组件</h2>
<p>显示的数量 { this.props.showNum }</p>
</div>
)
}
componentDidUpdate(prevProps) {
console.log(组件更新完毕, prevProps);
if (prevProps.showNum !== this.props.showNum ) {
// 可以做发送Ajax的请求
// 可以设置值 this.setState({})
//这样就不会导致 递归更新了
}
}
}
export default ClassCom
第三个阶段
卸载阶段
componentWillUnmount() { }
组件将要卸载的时候会被触发,可以做清除定时器 。
下面当num>3的时候 ,ClassCom 组件将会被卸载。
这个时候 ,componentWillUnmount生命周期将会被触发哈
componentWillUnmount 的使用
import React from react;
import ReactDOM from react-dom;
import ClassCom from "./components/ClassCom"
class Father extends React.Component{
state = {
num:1
}
addHandler = () => {
this.setState({
num:this.state.num+1
})
}
render() {
return (
<div>
<button onClick={this.addHandler}>增加</button>
{ this.state.num > 3 ? <p>豆豆已经被你打死了</p> : <ClassCom showNum={ this.state.num }></ClassCom> }
</div>
)
}
componentWillUnmount() { }
}
ReactDOM.render(
<Father></Father>,
document.getElementById(root)
)
子组件
import React from "react";
class ClassCom extends React.Component{
render() {
return (
<div>
<h2>我是组件</h2>
<p>我是豆豆,被打了 { this.props.showNum } 次</p>
</div>
)
}
componentWillUnmount() {
console.log(组件已经被卸载了)
}
}
export default ClassCom
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!