React-学习笔记(4-组件生命周期)

2023-11-12

1、旧 的生命周期函数(9个)

 

 

  • 初始化时调用的生命周期函数(初始化由 ReactDOM.render() 引发)

  1. constructor —— 就是类的构造器,最早执行的,一生只执行一次 。
  2. UNSAFE_componentWillMount —— 将要挂载,一生只执行一次。

                旧名称为 componentWillMount ,已经废弃。在未来的某个新版本开始将不再支持旧名称的写法。

  1. render —— 将组件渲染到页面中,将执行至少一次。
  2. componentDidMount —— 组件挂载完毕后执行,常在该函数内做一些初始化的操作。
  • 更新阶段会调用的生命周期函数(由组件内部的数据更新或父组件重新渲染时调用) 

  1. UNSAFE_componentWillReceiveProps —— 当前组件的父组件只要触发 render 重新渲染时,子组件就会调用这个生命周期函数 。

                 旧名称为 componentWillReceiveProps ,已经废弃。在未来的某个新版本开始将不再支持旧名称的写法。

  1. shouldComponentUpdate —— 该函数有一个 boolean 类型的返回值,决定是否进行更新操作。若该函数返回 false,则再不会执行下方的三个函数。

         该函数如果不自行指定的话,默认是返回一个true,继续更新操作的。若自行指定,则需要设定一个 boolean 类型的返回值,如果没有指定返回值,则返回一个 undefined,即 boolean 类型的 false,则不会接着执行更新的操作。

  1. UNSAFE_componentWillUpdate —— 即将更新,还没有更新。

                旧名称为 componentWillUpdate ,已经废弃。在未来的某个新版本开始将不再支持旧名称的写法。

  1. render —— 走到这里,数据已经更新,准备重新渲染组件。
  2. componentDidUpdate —— 数据更新完毕,组件重新渲染完毕。

        会接收到两个参数。分别是:旧的 props,旧的 state。(在新版生命周期中,新增了一个 getSnapshotBeforeUpdate 生命周期函数,会返回一个自定义的数据给 componentDidUpdate 作为第三个参数)

  • 卸载组件时调用的声明周期函数(由 ReactDOM.unmountComponentAtNode() 方法触发)

  1. componentWillUnmount —— 即将卸载当前组件,可以执行一下收尾性的工作 。

        下方代码简单演示除 UNSAFE_componentWillReceiveProps 生命周期函数之外所有的生命周期函数的相关内容。

class OldTotalExample extends React.Component{
    // 构造器 组件挂载前调用一次,最早
    constructor(props){
        console.log('constructor');
        super(props);
        this.state = {
            num:0
        }
    }

    // 点击按钮进行自增的函数(自定义函数)
    autoIncrement = ()=>{
        this.setState({
            num:this.state.num + 1
        })
    }

    // 点击按钮将组件卸载 (自定义函数)
    destroyComponent = ()=>{
        // 手动卸载当前组件的函数
        React.unmountComponentAtNode(document.getElementById('test'));
    }

    // 点击按钮强制更新组件 (自定义函数)
    forceRefresh = () =>{
        // 触发重新渲染
        this.forceUpdate();
        // 后续执行顺序 componentWillUpdate -> render -> componentDidUpdate
    }

    // 挂载前调用一次,一生中只调用一次
    UNSAFE_componentWillMount(){
        console.log('componentWillMount');
    }

    // 挂载完调用一次,一生只调用一次
    componentDidMount(){
        console.log('componentDidMount');
    }

    // 是否允许组件内部数据更新 setState 后调用或父组件重新 render 时
    // 需要返回一个 boolean 值以决定是否更新
    // 若该声明周期函数不写,则默认返回true,允许更新
    // 若写该函数,则返回值省略时,返回undefined,即对应boolean值为false,将不再更新
    shouldComponentUpdate(){
        console.log('shouldComponentUpdate');
        return true;
    }

    // 数据将要更新,组件将要重新渲染
    UNSAFE_componentWillUpdate(){
        console.log('componentWillUpdate');
        // 若由组件内部数据更新引起,此时还组件内的数据没有更新
        // 走完这个函数,将走 render 函数
        // 执行 render 前,数据已经更新完毕
        console.log('@',this.state);
    }

    // 组件内部数据更新或父组件重新render后,触发 shouldComponentUpdate ->
    // componentWillUpdate -> render -> componentDidUpdate(当前这个),表示数据和组件已经更新完毕
    // 会接收到两个参数,一个是旧的props,一个是旧的state
    componentDidUpdate(preprops, prestate){
        console.log('componentDidUpdate', preprops, prestate);
    }

    // 组件将要被卸载时调用
    componentWillUnmount(){
        console.log('componentWillUnmount');
    }

    // 组件内部数据更新时或父组件重新render时,该组件的render也重新调用
    render(){
        console.log('render',this.state);
        return (
            <div>
                <h1>current number:{this.state.num}</h1>
                <button onClick={this.autoIncrement}>click me to auto-increment</button><br/>
                <button onClick={this.destroyComponent}>click me to distroy the component</button><br/>
                <button onClick={this.forceRefresh}>click me to force refresh component</button>
            </div>
        )
    }
}

ReactDOM.render(<OldTotalExample/>, document.getElementById('test'));

 

        下方代码演示简单父子组件的使用、演示 UNSAFE_componentWillReceiveProps 生命周期函数相关的内容。

class Father extends React.Component{
    state = {
        currentYear:2023,
        name:'tom',
        age:25,
        gender:'man'
    }
    render(){
        let {currentYear, name, age, gender} = this.state;
        return(
            <div>
                {
                    // 当 currentYear 更新时,子组件也会触发从 componentWillReceiveProps 到
                    // componentDidUpdate 的重新渲染链,这里的 currentYear 不是子组件所依赖的数据
                }
                <h1>{currentYear}</h1>
                {
                    // 在父组件中使用子组件
                }
                <Children name={name} age={age} gender={gender}/>
                <button onClick={()=>{this.setState({age:age + 1})}}>lick to add age</button>
                <button onClick={()=>{this.setState({currentYear:currentYear + 1})}}>click into new year</button>
            </div>
        )
    }
}

// 子组件也是继承于 React.Component
class Children extends React.Component{
    /*
        只要是父组件重新render了,子组件这个生命周期函数以及
        shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate
        都会被接连调用(顺序即以上排列的顺序)
        不管是不是子组件所依赖于父组件的 props 值被更新
    */
    UNSAFE_componentWillReceiveProps(props){
        // 已经接收到'新'的 props 了,
        console.log(props);
    }

    render(){
        return (
            <div>
                <h2>name: {this.props.name}</h2>
                <h2>age: {this.props.age}</h2>    
                <h2>gender: {this.props.gender}</h2>    
            </div>
        )
    }
}

ReactDOM.render(<Father/>, document.getElementById('test'));

2、新 生命周期函数(9 - 3 + 2 = 8)

 

 

        以下三个旧的生命周期函数不建议再去使用:

  • UNSAFE_componentWillMount
  • UNSAFE_componentWillUpdate
  • UNSAFE_componentWillReceiveProps

        新增了两个生命周期函数(实际使用的频率都比较低):

  • statis getDerivedStateFromProps(props, state)

        如果该组件是单纯由 props 决定数据渲染的或状态依赖于 props ,则可以使用到该静态方法。

        该方法接收到两个参数,一个是props,一个是当前组件的state。

        如果定义了静态 getDerivedStateFromProps, React将在调用render之前调用它,无论是在初始挂载时还是在后续更新时。

        它应该返回一个对象来更新状态,或者返回null来表示不更新任何东西。

 

  • getSnapshotBeforeUpdate(preProps, preState)

        当组件即将要渲染到页面上时,将调用该方法。

        该方法接收到两个参数,一个是旧的props,一个是当前组件旧的 state。

        如使用该方法,则必须要返回一个快照值(snapshot)。可以是任何类型的数据,如数值、字符串、对象等,也可以是null,但不能是undefined。该快照值将作为执行 componentDidUpdate的第三个参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React-学习笔记(4-组件生命周期) 的相关文章

随机推荐

  • 【GAMES101闫令琪图形学】作业0(配置开发环境)

    去games101往期作业汇总帖下载作业0的压缩包 作业0是让你配环境的 很简单 操作系统 VirtualBox虚拟机 Ubuntu20 04 比课程提供的虚拟硬盘版本更高 安装eigen和cmake sudo apt get instal
  • UncaughtExceptionHandler 捕获异常线程以及出现异常重启

    1 捕获线程的异常只需要修改Executor产生线程的方式 即为每一个线程添加一个实现了Thread UncaughtExceptionHandler接口的异常处理器来捕获线程发生的异常 出现异常之后在捕捉异常中在重新开启线程即可 例子如下
  • (第十四届蓝桥杯真题)砍树

    样例输入 6 2 1 2 2 3 4 3 2 5 6 5 3 6 4 5 样例输出 4 分析 由于题目中说明这个图是一棵树 所以任意两点之间的路径都是唯一的 那么我们要想使得u和v在不同的连通块中 我们只需要将其两点之间路径上的任意一条边删
  • MySQL • 源码分析 • SHUTDOWN过程

    摘要 ORACLE 中的SHUTDOWN MySQL SHUTDOWN LEVEL 暂时只有一种 源码中留了 LEVEL 的坑还没填 在此借用 Oracle 的 SHUTDOWN LEVEL 分析 Oracle SHUTDOWN LEVEL
  • WinSCP 与 Putty 中文显示乱码解决方法

    WinSCP 1 打开WinSCP 在登录会话界面中选定将要登录的会话 2 2 点击旁边的 编辑 按钮 3 3 在左侧树型菜单中找到 环境 项 并打开它 4 4 在右侧中一项为 文件名UTF 8编码 选择 开启 5 5 搞定 Putty 1
  • 【转载】设备\Device\Harddisk0\D 有一个不正确的区块

    http blog sina com cn s blog 5adb84f80100d3fs html 近一阵子 每次早晨一开机 便进不了系统 偶尔还蓝屏一下 代码为0x0000218 stop类的 开箱清洁一下 拔拔插插 过一会儿又可以进去
  • Tag:input type='file' 的文件长度问题

    http www cnblogs com rickel archive 2005 06 21 178385 html Q 發現一個現象 對於上傳文件時用到的標簽
  • leetcode(1) 两数之和

    题目描述 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7
  • flutter imagepicker点击不了

    参考 already active 图像选取器已处于活动状态 null null 将Gradle版本降级为 classpath com android tools build gradle 3 5 4
  • C# 入门级教程网站

    http m biancheng net view 3026 html 记录一下 需要查询资料的时候就去检索一下
  • Matlab使用记录1-波形

    1 正弦波 清内存 关闭窗口 准备工作 clear close all clc signal 三要素 A 5 amplify f 2 Hz w 2 pi f rad s p 0 rad 采样 T 1 s 观测时间 fs 20 f Hz 采样
  • shell脚本中 set -ex

    刚刚学会了一个很实用的shell命令set ex 在这里分享一下 set e 先说说set e 这个参数的含义是 当命令发生错误的时候 停止脚本的执行 通常来说 我们会习惯于使用 来实现这样的功能 比如 echo 1 rm non exis
  • computed和watch的区别?(Vue面试题)

    有两种答法 大家自行参考 也可以结合起来 第一种 conputed 能完成的功能 watch 都可以完成 watch 能完成的功能 computed 不一定能完成 例如 watch 可以进行异步操作 两个重要的小原则 所有被 Vue 管理的
  • 用Java实现扑克牌游戏——简易炸金花

    一 思想呈现 首先 我们需要创建扑克牌 用字符串型定义扑克牌的花色 用整数型定义扑克牌上的数字 便于扑克牌的保存 再通过构造方法产生对应的对象 对外提供getter和setter方法便于使用 然后重写方法 使结果返回对应的花色与数字 接着来
  • 谷歌翻译网址

    个人总结的几个谷歌工具直连地址 http translate google cn hl zh CN http translate google cn http translate google cn hl cn
  • k8s集群nfs网络持久卷存储实现

    1 nfs介绍和作用 nfs卷能将 NFS 网络文件系统 挂载到Pod 中 不像 emptyDir 那样会在删除 Pod 的同时也会被删除 nfs卷的内容在删除 Pod 时会被保存 卷只是被卸载 2 pv和pvc介绍 pv持久卷是集群中的一
  • C语言学习笔记(二)————数据类型相关,单双引号区别

    1 c语言中的数据类型及输出 常用的几种数据类型 输出格式 int 整型 占用4字节 d 打印整型 short 短整型 占用2字节 hd 打印short类型 d也可以 long 长整型 Windows为4字节 也可以理解32位编译器中占4字
  • cookie实现记住密码

    一 什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段 Cookie的目的就是为用户带来方便 为网站带来增值 虽然有着许多误传 事实上Cookie并不会造成严重的安全威胁 Cookie永远不会以任何方
  • 舆情&传染病时空分析文献阅读笔记

    1 朱炤瑗 秦昆 关庆锋 罗萍 姚博睿 漆林 周扬 COVID 19期间国家关系交互网络时空分析研究 J 地理与地理信息科学 2022 38 01 15 22 研究问题 COVID 19疫情不断蔓延为国际政治 外交关系等带来深刻影响 目前基
  • React-学习笔记(4-组件生命周期)

    1 旧 的生命周期函数 9个 初始化时调用的生命周期函数 初始化由 ReactDOM render 引发 constructor 就是类的构造器 最早执行的 一生只执行一次 UNSAFE componentWillMount 将要挂载 一生