React生命周期 图解+代码详细讲解

在这里插入图片描述

第一步:初始化阶段

即(constructor) 继承了基类,才会有render() 方法,生命周期才能使用。
其中super(),用来调用基类的构造方法,将父组件的props注入子组件【props只读,不可变;state可变】

1.组件在使用时,先进入构造函数constructor。做了什么

  • 在构造函数主要通过super()访问父类React.Component的构造函数,要把props形参传递到父类React.Component中,让父类React.Component去初始props的默认值以及props的数据类型。

  • 初始化当前组件的state,纠正事件中的this,等等

第二步:挂载阶段

componentWillMount()
componentWillMount() 仅在render()方法前被调用一次,如果在该方法中调用了setState方法去改变组件的状态值,那么调用render()后,将会直接看到改变过了的状态值,并且不论状态值怎么改变,componentWillMount()都不会再被调用。
但在最新的react我们发现该方法已被弃用

第三步:组件更新阶段

render() setState引起的state更新、父组件重新render引起的props更新,更新后的state、props无论是否有变化都会引起子组件重新更新render
这里可以用shouldComponentUpdate()来优化

合适获取数据更为合适?
组件开始渲染,一般情况组件开始渲染时要提供好数据,觉得在componentWillMount获取数据合适。最合适的获取数据的地方componentDidMount。因为获取数据后会更改state,如果state发生变化,render默认会重新执行

componentDidMount()
件挂载到DOM后调用,方法会在组件已经被渲染到 DOM 中后运行,只会调用一次!

shouldComponentUpdate()
返回true继续执行,false阻止组件更新,减少不必要的渲染,优化性能;就算上一个方法执行了this.state更新了state,但在render之前此方法中的this.state依然指向更新之前的!!!,否则就永远是true了;

componentWillUpdate()
在render之前执行,进行更新前的操作,比较少用;

componentDidUpdate
此方法在组件更新后被调用,可以操作组件更新的DOM,prevProps和prevState指组件更新前的props和state

第四步:卸载阶段

componentWillUnmount()
在组件被卸载前调用,可以执行一些清理工作,如清除定时器,清除挂载后手动创建的DOM,避免内存泄漏。

源码如下

import React from 'react'

export default class ComSix extends React.Component{
    
    constructor(props){
        super(props)

        console.log("1.组件在使用时,先进入构造函数constructor。做了什么:1.在构造函数主要通过super()访问父类React.Component的构造函数,要把props形参传递到父类React.Component中,让父类React.Component去初始props的默认值以及props的数据类型。2. 初始化当前组件的state,纠正事件中的this,等等")

        this.state = {
            count: 10
        }

    }

    changeCount(){
        this.setState({
            count: this.state.count + 1
        })
    }

    componentWillMount(){
        console.log('2. 组件即将准备好,已被废弃');
    }

    render(){
        console.log('3. 组件开始渲染,一般情况组件开始渲染时要提供好数据,觉得在componentWillMount获取数据合适。最合适的获取数据的地方componentDidMount。因为获取数据后会更改state,如果state发生变化,render默认会重新执行')
        return (
            <div style={{border:'2px solid blue',margin:'20px 0',padding:'20px 0'}}>
                <h1>演示生命周期{this.props.msg}-{this.state.count}</h1>
                <button onClick={()=>{this.changeCount()}}>更改count</button>
            </div>
        );
    }

    componentDidMount(){
        console.log("4. 组件完全准备好,虚拟DOM结构生成。")
    }

    componentWillReceiveProps(){
        console.log("5. 不会执行,废弃了")
    }

    shouldComponentUpdate(){
        console.log("6. 组件是否重新渲染?返回true,执行render(),返回false,不执行render()")
        return true;
    }

    componentWillUpdate(){
        console.log("7.数据发生变化时,组件即将更新")
    }

    componentDidUpdate(){
        console.log('8.数据发生变化时,组件更新完成')
    }
    
    componentWillUnmount(){
        console.log('9.组件销毁前执行,路由切换时可以看到效果。')
    }

}
React生命周期图解是一个描述组件从创建、更新到卸载整个生命周期过程的概念图,它可以帮助开发者理解何时执行哪些操作。主要分为以下几个阶段: 1. **挂载前 (Mounting)**: - `constructor()`: 初始化函数,可以设置状态(state)和绑定事件处理函数。 - `static getDerivedStateFromProps(props, state)`: 首次接收 props 更新时运行,用于基于新的props计算新状态。 - `shouldComponentUpdate(nextProps, nextState)`: 在渲染之前检查是否需要更新,默认会一直更新,除非返回 false。 2. **挂载 (Mounting) 和更新 (Updating)**: - `render()`: 组件的核心部分,返回虚拟DOM。 - `getSnapshotBeforeUpdate(prevProps, prevState)`: 渲染前获取节点快照(如滚动位置),通常不做实际渲染。 - `componentDidMount()`: 成功渲染后立即执行,常用于初始化数据请求或DOM交互。 3. **更新 (Updating)**: - `getDerivedStateFromProps()`: 每次接收到新的props时都会运行,用于修改状态。 - `shouldComponentUpdate()`: 决定是否再次调用 render(),如果返回 true,则继续。 - `render()`: 根据最新的状态和 props 生成新的虚拟 DOM。 - `getSnapshotBeforeUpdate()`: 同上,更新前获取快照。 - `componentDidUpdate(prevProps, prevState, snapshot)`: 更新完成后执行,可用于更新DOM或发送网络请求。 4. **卸载 (Unmounting)**: - `componentWillUnmount()`: 组件即将卸载前执行,常用于清理资源(如清除定时器或取消订阅)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值