React的生命周期

2023-10-29

目录

16.3之前的生命周期:

 16.3之后的生命周期:

1、React生命周期阶段

 2、在React中网络请求在哪个生命周期中发起?


16.3之前的生命周期:

 16.3之后的生命周期:

1、React生命周期阶段

⽬前 React 16.8+ 的⽣命周期分为三个阶段:挂载阶段、更新阶段、卸载阶段

        在 React 16 版本中,三个之前的生命周期被标识为废弃,并在 React 17 中计划全部删除它们:

  • componentWillMount

  • componentWillReceiveProps

  • componentWillUpdate

当它们被删除后,将会只保留三个添加了UNSAVE_前缀的函数版本,作为向下兼容用途。因此我们在新项目中,要尽量避免使用这几个生命周期而使用最新的生命周期函数。

因此我们在新项目中,要尽量避免使用这几个生命周期而使用最新的生命周期函数。

 挂载阶段:

        constructor、getDerivedStateFromProps、render、componentDidMount

constructor:组件的构造函数,它会最先被执⾏,我们通常在构造函数⾥初始化 state 状态对象、或给⾃定义⽅法绑定 this

getDerivedStateFromProps

  • 相当于componentwillmount 和 componentWillReceiveProps合并(课看上面的图理解)
  • 这是个静态⽅法,当我们接收到新的属性后想要去修改 state 时可以使用,该方法类似于 componentWillReceiveProps,可以用来控制 props 更新 state 的过程。它返回一个对象表示新的 state。如果不需要更新组件,返回 null 即可。
  • 主要是应用在于封装组件时调用,组件的state取决于props变化
  • 无条件的根据 props来更新内部 state,也就是只要有传入 props值, 就更新 state
  • 只有 props 值和 state值不同时才更新 state 值

        //  若state的值在任何时候都取决于props,那么可以使用getDerivedStateFromProps

这不就是和React.useEffect(()=>{},[]),中的依赖参数同等效果,我们在封装组件时可以用到

类组件:
class List extends React.Component {
   state = {
      list: []
   }
   static getDerivedStateFromProps(props, state) {
      if(props.list !== state.list){
         return {
            list: props.list
         }
      }
      return null;
   }
   render() {
        .... // 展示 list
   }
}


函数组件:
// 函数组件
const List  = React.memo((props) =>{
   const [list,setList] = React.useState([]);

   React.useEffect(()=>{
      setList(props.list);
   }, [props.list]);

   return (
      .... // 展示 list
   )
});

render:这是个只返回需要渲染内容的纯函数,不要包含其它的业务逻辑,可以返回原⽣的 DOM、React 组件、Fragment、Portals、字符串和数字、Boolean 值 和 null 值等内容

componentDidMount:在组件装载后被调⽤,此时可以获取 DOM 节点并操作,对服务器的请求、订阅等操作都可以写在这个地方,但记得要在 componentWillUnmount 中取消订阅,即释放资源

 更新阶段:

        getDerivedStateFromProps、shouldComponentUpdate、render、getSnapshotBeforeUpdate、 componentDidUpdate

getDerivedStateFromProps:此⽅法在更新、挂载阶段都可能会调⽤

shouldComponentUpdate(nextProps, nextState):该函数有两个参数 nextProps 和 nextState,表示新的属性和变化之后的状态;它返回⼀个布尔值,true 表示会触发重新渲染,false 则表示不会触发重新渲染,默认返回 true。我们通常利⽤该⽣命周期来优化 React 程序的性能

render:更新阶段也会触发此⽣命周期

getSnapshotBeforeUpdate(prevProps, prevState)参考下面代码  该⽅法在 render 之后、在 componentDidUpdate 之前被调⽤,它有两个参数prevProps, prevState,表示之前的属性和状态,并且该函数有⼀个返回值,返回值会作为第三个参数传给 componentDidUpdate,如果不想要返回值则返回 null 即可。该⽣命周期必须与 componentDidUpdate 搭配使⽤

class ScrollingList extends React.Component {
  constructor(props) {
    super(props);
    this.listRef = React.createRef();
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    // 我们是否在 list 中添加新的 items ?
    // 捕获滚动​​位置以便我们稍后调整滚动位置。
    if (prevProps.list.length < this.props.list.length) {
      const list = this.listRef.current;
      return list.scrollHeight - list.scrollTop;
    }
    return null;
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    // 如果我们 snapshot 有值,说明我们刚刚添加了新的 items,
    // 调整滚动位置使得这些新 items 不会将旧的 items 推出视图。
    //(这里的 snapshot 是 getSnapshotBeforeUpdate 的返回值)
    if (snapshot !== null) {
      const list = this.listRef.current;
      list.scrollTop = list.scrollHeight - snapshot;
    }
  }

  render() {
    return (
      <div ref={this.listRef}>{/* ...contents... */}</div>
    );
  }
}

componentDidUpdate(prevPropsprevStatesnapshot):该⽅法在 getSnapshotBeforeUpdate ⽅法之后被调⽤,它有三个参数表示之前的属性、之前的状态。第三个参数是 getSnapshotBeforeUpdate 所返回的,如果触发某些回调函数时需要⽤到 DOM 元素的状态,则将对⽐或计算的过程迁移⾄ getSnapshotBeforeUpdate,然后在 componentDidUpdate 中统⼀触发回调或更新状态

 卸载阶段:

        componentWillUnmount

componentWillUnmount:当组件被卸载或销毁时就会被调⽤,我们可以在这个函数⾥去做一些释放资源的操作,如:清除定时器、取消⽹络请求、清理⽆效的 DOM 元素等

 2、在React中网络请求在哪个生命周期中发起?

 有人认为 React 中的网络异步请求,应该放在 componentWillMount 这个生命周期函数中发起,这样可以提前进⾏异步请求,以避免⽩屏现象。其实这个观点是有问题的。

由于 JavaScript 中异步事件的性质,当进行异步 API 调⽤时,浏览器会在此期间继续执⾏其他⼯作。因此,当 React 渲染⼀个组件时,它并不会等待 componentWillMount 执行完成任何事情,而是继续往前执行并继续做 render ,没有办法 “暂停” 渲染以等待远程数据的返回

⽽且,在 componentWillMount 中发起请求会存在⼀系列潜在问题:

  • 在用 React 作为服务器渲染(SSR)时,如果在 componentWillMount 中进行数据的获取,则 fetch data 会执⾏两次:⼀次在服务端,⼀次在客户端,这就造成了多余的请求

  • 在 React 16 使用 React Fiber 架构重写后,componentWillMount 可能会在⼀次渲染中被多次调⽤。

⽬前官⽅推荐的是在 componentDidmount 中进行异步请求

如遇到特殊需求,需要提前进行数据的请求,可考虑采用在 constructor 中进行。

另外,由于在 React 17 之后 componentWillMount 被废弃仅保留 UNSAFE_componentWillMount,所以要慎用该生命周期。

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

React的生命周期 的相关文章

随机推荐

  • 在使用node.js时发现的问题,npm版本版本过低,升级报错

    博主 之前安装nodejs 并没有通过nvm来控制 后面发现nvm很好用 就直接安装nvm使用 但没有把之前安装的nodejs版本删掉 就导致出现了很多很多的bug 找原因找太久 就想发文记入一下 问题一 nvm中切换不了nodejs版本
  • Android内存压力测试工具(memtester移植)

    该文章转载于 android用memtester内存压力测试 W歹匕示申W的博客 CSDN博客 Android内存压力测试工具 memtester移植 甜牛奶蛋糕的博客 CSDN博客 android 内存压力测试 DRR参考配置OK之后 首
  • 当下,最适合地产人的副业来了

    人无远虑 必有近忧 对于这两年的地产人来说 更是如此 大裁员 大降薪 叠加yi情的反复侵扰 地产人的生存处境似乎越来越糟糕 你会发现身边只能靠着工资养家的人 在行业动荡期无疑是被动和焦虑的 还担心突如其来的裁员 挣钱不易 人 总得提前为自己
  • Netty的并发编程实践2:volatile的正确使用

    长久以来大家对于volatile如何正确使用有很多的争议 既便是一些经验丰富的Java设计师 对于volatile和多线程编程的认识仍然存在误区 其实 volatile的使用非常简单 只要理解了Java的内存模型和多线程编程的基础知识 正确
  • Qt:实现子线程发送信号父线程切换图片

    mainwindow h中代码 ifndef MAINWINDOW H define MAINWINDOW H include
  • SAP之FIORI(7)-MVC加载模式

    SAP之FIORI 7 MVC加载模式 MVC 是Model View Controller的简称 用于将程序的数据 界面展示和用户交互分离 通过这种分离 可以简化开发 以及让某部分变动的时候 不需要影响其他部分 从而降低耦合 Model
  • 深度学习:CSPNet

    深度学习 CSPNet 前言 解决的问题 Method 目前主流网络存在的问题 Partial Dense Block Partial Transition Layer Exact Fusion Model 实验 前言 CSPNet 是作者
  • WEB开发django-视图-CBV

    1 简历 在这里我们使用路由匹配视图类 而不是视图函数 2 路由 urls py from django urls import path re path include from app01 import views urlpattern
  • Topaz Gigapixel AI 中文汉化版是一款由Topaz Labs公司开发的图片无损放大软件

    Topaz Gigapixel AI 中文汉化版是一款由Topaz Labs公司开发的图片无损放大软件 第一个也是唯一一个使用人工智能功能扩展图像的桌面应用程序 同时添加自然细节以获得惊人的效果 使用深度学习技术 Topaz Gigapix
  • Matlab 单位阶跃响应曲线三维图、上升时间、峰值时间、最大过调量和调整时间

    1 Matlab作单位阶跃响应曲线的三维图 定义闭环系统传递函数如下 H s 1 s 2 2 zeta s 1 Matlab作单位阶跃响应曲线的三维图 标准二阶系统响应曲线 wn 1 t 0 0 2 10 zeta 0 0 2 0 4 0
  • 浅谈Linux设备虚拟化技术的演进之路

    PART 01 序言 设备虚拟化技术 一直是云计算领域最重要的基础技术之一 我们在虚拟机里面看到的形形色色的设备 比如 网卡 磁盘 键盘 鼠标等 都离不开这项技术的帮助 这篇文章 我们将从技术演进的角度来谈一谈 Linux 现有的以及即将到
  • 初始Vue

    初始Vue 1 想让Vue工作 就必须创建一个Vue实例 且要传入一个配置对象 2 root容器里得到代码依然符合html规范 只不过混入了一些特殊的Vue语法 3 root 容器里的代码被称为 Vue模板 先有容器 后有实例 1 模板通过
  • oracle rac数据库常用运维sop

    oracle RAC数据库日常巡检工作一下六步骤 1 检查操作系统本地磁盘空间 主要查看操作系统 的空间使用情况 超过70 要注意 2 检查Oracle数据库RAC集群服务状态 除了ora gsd服务状态为OFFLINE 其他的服务正常状态
  • Latex 添加关键字keywords

    无论是自己写的模板还是下载的模板没有keywords newcommand keywords 1 textbf Keywords 1 keywords keywords1 keywords2 keywords3 加上全文模板 documen
  • Diverse Image Style Transfer via Invertible Cross-Space Mapping

    可逆的跨空间映射实现多样化的图像风格传输 摘要 图像风格迁移可以将艺术风格迁移到任意照片上 以创建新颖的艺术图像 尽管风格迁移本质上是一个不适定问题 但现有方法通常假设某种唯一结果 而无法捕获潜在可能的完整分布 本文提出一个多样化的图像风格
  • MongoDB资料汇总

    MongoDB是一个基于分布式文件存储的数据库 由C 语言编写 旨在为WEB应用提供可扩展的高性能数据存储解决方案 它的特点是高性能 易部署 易使用 存储数据非常方便 主要功能特性有 面向集合存储 易存储对象类型的数据 模式自由 支持动态查
  • 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin

    FastAdmin是一款基于 ThinkPHP5 Bootstrap 的极速后台开发框架 主要特性 基于Auth验证的权限管理系统 支持无限级父子级权限继承 父级的管理员可任意增删改子级管理员及权限设置 支持单管理员多角色 支持目录和控制器
  • OpenCV中的Shi-Tomasi角点检测器

    OpenCV中的Shi Tomasi角点检测器 1 效果图 2 源码 参考 上一篇博客介绍了Harris角点检测器 这篇博客将介绍另一个角点检测器 Shi Tomasi角点检测器 Shi Tomasi角点检测器是Harris角点检测器的优化
  • Java配置39-搭建ELK服务器

    目录 1 服务器环境 2 安装JDK 3 安装elasticsearch 2 修改配置文件 3 修改系统参数 4 设置资源参数 5 设置用户资源参数 6 创建数据和日志目录 7 启动elasticsearch 4 安装logstash 1
  • React的生命周期

    目录 16 3之前的生命周期 16 3之后的生命周期 1 React生命周期阶段 2 在React中网络请求在哪个生命周期中发起 16 3之前的生命周期 16 3之后的生命周期 1 React生命周期阶段 前 React 16 8 的 命周