React函数式组件如何用hook模拟类组件生命周期?

react hooks讲解--通俗易懂版 useState有两个状态,一个是status,一个是setStatussetStatus修改数据后,会触发的re-renderre-render:重新渲染,,re-render是react自身执行一系列的组件自身生命周期,render,虚拟dom之间diff之后,如果dom发生变化,则更新新的dom,如果没有变化则不更新。如何避免不必要的re-render? 阅读详情

前言

在 React 16.8 之前,函数组件只能是无状态组件,也不能访问 react 生命周期。hook 做为 react 新增特性,可以让我们在不编写 class 的情况下使用 state 以及其他的 react 特性,例如生命周期。接下来我们便举例说明如何使用 hooks 来模拟比较常见的 class 组件生命周期。

constructor

class 组件

class Example extends Component {
    constructor() {
        super();
        this.state = {
            count: 0
        }
    }
    render() {
      return null;
  }
}
复制代码

函数组件不需要构造函数,可以通过调用 useState 来初始化 state

function Example() {
  const [count, setCount] = useState(0);
  return null;
}
复制代码

componentDidMount

class 组件访问 componentDidMount

class Example extends React.Component {
  componentDidMount() {
    console.log('I am mounted!');
  }
  render() {
    return null;
  }
}
复制代码

使用 hooks 模拟 componentDidMount

function Example() {
  useEffect(() => console.log('mounted'), []);
  return null;
}
复制代码

useEffect 拥有两个参数,第一个参数作为回调函数会在浏览器布局和绘制完成后调用,因此它不会阻碍浏览器的渲染进程。
第二个参数是一个数组

  • 当数组存在并有值时,如果数组中的任何值发生更改,则每次渲染后都会触发回调。
  • 当它不存在时,每次渲染后都会触发回调。
  • 当它是一个空列表时,回调只会被触发一次,类似于 componentDidMount。

shouldComponentUpdate

class 组件访问 shouldComponentUpdate

shouldComponentUpdate(nextProps, nextState){
  console.log('shouldComponentUpdate')
  // return true 更新组件
  // return false 则不更新组件
}
复制代码

hooks 模拟 shouldComponentUpdate

const MyComponent = React.memo(
    _MyComponent, 
    (prevProps, nextProps) => nextProps.count !== prevProps.count
)
复制代码

React.memo 包裹一个组件来对它的 props 进行浅比较,但这不是一个 hooks,因为它的写法和 hooks 不同,其实React.memo 等效于 PureComponent,但它只比较 props。

componentDidUpdate

class 组件访问 componentDidUpdate

componentDidMount() {
  console.log('mounted or updated');
}

componentDidUpdate() {
  console.log('mounted or updated');
}
复制代码

使用 hooks 模拟 componentDidUpdate

useEffect(() => console.log('mounted or updated'));
复制代码

值得注意的是,这里的回调函数会在每次渲染后调用,因此不仅可以访问 componentDidUpdate,还可以访问componentDidMount,如果只想模拟 componentDidUpdate,我们可以这样来实现。

const mounted = useRef();
useEffect(() => {
  if (!mounted.current) {
    mounted.current = true;
  } else {
   console.log('I am didUpdate')
  }
});
复制代码

useRef 在组件中创建“实例变量”。它作为一个标志来指示组件是否处于挂载或更新阶段。当组件更新完成后在会执行 else 里面的内容,以此来单独模拟 componentDidUpdate。

componentWillUnmount

class 组件访问 componentWillUnmount

componentWillUnmount() {
  console.log('will unmount');
}
复制代码

hooks 模拟 componentWillUnmount

useEffect(() => {
  return () => {
    console.log('will unmount');
  }
}, []);
复制代码

当在 useEffect 的回调函数中返回一个函数时,这个函数会在组件卸载前被调用。我们可以在这里面清除定时器或事件监听器。

总结

引入 hooks 的函数组件功能越来越完善,在多数情况下,我们完全可以使用 hook 来替代 class 组件。并且使用函数组件也有以下几点好处。

  • 纯函数概念,同样的 props 会得到同样的渲染结果。
  • 可以使用函数组合,嵌套,实现功能更加强大的组件。
  • 组件不会被实例化,整体渲染性能得到提升。

但是 hooks 模拟的生命周期与class中的生命周期不尽相同,我们在使用时,还是需要思考业务场景下那种方式最适合。

React Hooks深度解析:`useEffect`模拟生命周期 useEffect通过useEffect,我们可以更加灵活地在函数组件中处理副作用,而无需依赖于类组件的生命周期方法。这不仅简化了代码,还提高了组件的可读性和可维护性。我们将持续更新更多高质量的前端技术内容。如果你有任何问题或想法,欢迎在下方留言,让我们一起探讨和进步!作者:[极客前端探索者]日期:2024年06月17日。 阅读详情

相关推荐

如何使⽤React的useEffect Hook来模拟componentDidMount和componentDidUpdate?

传递依赖项数组,因此它会在每次渲染后执⾏,包括组件挂载和每次更新。如果你想在组件更新时执⾏某些操作,但不在挂载时执⾏,你需要将某些状态或props值作为依赖项传递给依赖项数组。然⽽,在⼤多数情况下,你不需要这样做,因为。会在组件挂载和每次更新后执⾏。Hook 是⼀个强⼤的⼯具,它允许你在函数组件中执⾏副作⽤操作,包括。⾏),你可以使⽤⼀个空数组作为依赖项。(即在组件更新后执⾏,但不在挂载时执。,因为默认情况下它就是这样⼯作的。只在组件挂载时执⾏,你可以将。默认就会在挂载和更新后执⾏。

2401_86113453的博客 672

面试题:Hooks 与 React 生命周期的关系

你真的了解 React 生命周期吗?React 生命周期很多人都了解,但通常我们所了解的都是 单个组件 的生命周期,但针对 Hooks 组件、多个关联组件(父子组件和兄弟...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 2694

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

入,突破了数字接口的视频输入性能瓶颈,提供两倍于前代产品的视频输入能力。视频编解码引擎、视频图像处理的算法效果及性能得到了进一步提升。芯片为客户产品提供了高性能、优异图像质量。推理引擎,支持多种智能算法应用。合丰富的外围设备及高速接口,该。解决方案,广泛用于模拟高清。产品应用开发的新一代专。四核处理器和性能强大的。

szhorsway的博客 1011

React Hooks生命周期

最近在写react项目,所以一直想写函数组件和类组件生命周期相关的一些知识总结。基础知识,仅用来复习,和巩固学习。

qq_43205326的博客 3135

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 908

利用pytorch长短期记忆网络LSTM实现股票预测分析

长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。LSTM主要就是加入了三个门控:第一个开关遗忘门:负责控制继续保存长期状态c;第二个开关输入门:负责控制把即时状态输入到长期状态c;第三个开关输出门:负责控制是否把长期状态c作为当前的LSTM的输出。

优快云 精品推荐 1万+

React学习笔记:实用又好用的Hooks函数

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。

老司机的后备箱 811

CANbus收发器ADM3053BRWZ-REEL7应用原理图设计

ADM3053 在 CAN 协议控制器与物理层总线之间创建一个 完全隔离的接口。该器件具有限流和热关断特性,可防止输出短路。额定温 度范围为工业温度范围,提供 20 引脚、宽体 SOIC 封装。该器件采用 5 V 单电源供电, 提供完全隔离的 CAN 解决方案。ADM3053 是一款隔离式控制器区域网络 (CAN) 物理层收 发器,集成隔离 DC/DC 转换器,符合 ISO 11898 标准。该器件采用 ADI 公司的。Coupler® 技术,将双通道隔离器、 CAN 收发器和 ADI 公司的。

zhusl6688的博客 1239

React Hooks的学习与自我理解

存在的意义         Hooks的作用在于完美过渡React中的类写法到函数式表示,因为我们知道React的函数式表示是不能使用生命周期的,Hooks可以代替React中的生命周期写法,这样就可以帮助完美过渡到函数式表示。这么做的意义是,类和生命周期的写法,不得不将不同的类互相联系起来,导致其中的业务逻辑会因为生命周期交错在一起而使得业务逻辑复杂难以维护      &nbs

反手一个bug的博客 410

uniapp - 最新实现hbuilder项目运行到ios基座或苹果ios真机设备详细教程,如何在ios苹果手机上真机运行测试,IOS自定义基座在线打包调试(uniapp项目如何在苹果手机上运行调试)

uni-app,苹果,app,ios,设备,自定义基座,运行app到苹果手机,mac电脑,Xcode,hbuilderX,运行ios基座调试Uniapp,无需打包,苹果证书,ipa,运行失败,报错,无法启动,连接失败,出错,详细教程,如何解决这个问题,怎么办,申请iOS证书,运行项目到iOS基座,打包ios自定义基座,在iOS真机上运行,新手小白,超级详细的教程,dcloud如何苹果ios系统真机测试,调试基座失败,真机调试ios app,App基座安装后无法打开问题,真机运行时检测不到手机的问题或者基座安

✅ 精选推荐文章 1万+

[yolov5/yolov8修改]替换yolov5/yolov8中的主干网络为EfficientNetv2

针对yolov5和yolov8的主干网络进行替换。

PLH19990227的博客 4147

Hooks详解(一)

在React中,创建组件的方式有两种:类式组件和函数式组件。对于刚刚学习react的我(小白)类式组件还是比较容易理解和学习,因为在之前有Vue的学习基础,React的类式组件和Vue的组件可以对比着进行学习,相对来说还是比较容易的。没有学习过类式组件的可以自行进行学习,在这里就不过多说明。本文章是本人在学习React Hooks所总结的,其中为了方便理解不乏一些大白话,望理解! 下面就开始Hooks的相关介绍吧! 对比类式组件来说函数式组件中没有状态和生命周期,这就是hooks所产生的原因,可以让函数式组

weixin_45615650的博客 2340

Oracle EBS与SAP数据数据切换至迁移华为MetaERP分析

Oracle EBS到华为MetaERP的数据迁移可采用“表对表复制”思路,因其模块化设计下数据模型标准化、边界清晰。核心业务对象存储在结构明确的主表中,与MetaERP模型兼容度高,便于直接映射。而SAP到MetaERP的迁移则因SAP高度优化的复杂表结构(如簇表/池表)、数据分散冗余、深度依赖配置等特点,无法简单复制,必须采用基于业务对象的迁移方法,通过视图/BAPI提取数据并进行深度转换。两种迁移的本质差异源于源系统的数据模型设计理念不同。

金牌架构师 1379

React类组件生命周期与this关键字

这个清理函数中的代码,会在组件更新时,以及组件卸载时执行,在其中可以拿到组件更新之前或者卸载之前的状态。上述的useEffect的依赖项为[count],说明函数主体内的内容会在组件初次挂载时,以及count更新时会执行,相当于类组件中的componentDidMount函数和componentDidUpdate函数。类组件上述的众多生命周期函数,在函数式组件中只需要一个useEffect hook就可以达到一样的效果,并且代码量大大减少。在根组件中引入类组件,模拟组件的卸载;(可以获取上次的状态)

chaozhou的博客 721

【数据分析八步法】将模糊需求转化为可验证的分析问题

国内访问Huggingface官方源常遇网络问题,可通过切换国内镜像提升下载速度。三种配置方式:1)设置HF_ENDPOINT环境变量;2)在from_pretrained中直接指定镜像参数;3)修改本地Huggingface配置文件。常用镜像包括hf-mirror.com、阿里云ModelScope和清华镜像源。注意镜像同步延迟、私有模型限制,建议配合huggingface-cli工具使用,必要时取消代理设置。合理配置镜像源可显著改善Huggingface生态使用体验。

Mr数据杨 858

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法

组件被创建,插入到DOM 树的过程;:是组件中 props 以及state 发生变化时,重新render渲染视图过程;:是DOM被从虚拟DOM树移除的过程;每个阶段都伴随着一系列的生命周期方法,这些方法为开发者提供了在类式组件不同阶段执行操作不同代码的机会,使开发人员能够更好的处理业务交互。

刺客-Andy 的博客 2228

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

如何利用 React 的useEffect Hook 模拟componentDidMount、componentDidUpdate和componentWillUnmount生命周期?

在 React 里,`useEffect` 这个 Hook 特别好用,它能让我们模拟出类组件里的 `componentDidMount`、`componentDidUpdate` 和 `componentWillUnmount` 这些生命周期函数。

前端大白话 2136

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

react中类式组件与函数式组件的区别

类式组件使用ES6的class语法定义。继承自React.Component。在构造函数(constructor)中初始化state。使用this关键字访问组件的属性和状态。函数式组件使用JavaScript函数定义。不需要继承React.Component。无法直接使用this,而是通过props接收外部传入的属性。使用React Hooks(如useState、useEffect)来管理状态和副作用。

hexadecimal_001的博客 1701

React 的 类组件 和 函数式组件 有什么区别?

函数式组件和类组件在功能上已趋于等价,但函数式组件凭借 Hooks 在代码简洁性、逻辑复用性、未来兼容性上更具优势。建议开发者优先掌握函数式组件的使用,同时了解类组件以维护旧代码。

sissizZ的博客 1021

如何使用 React Hooks 替代类组件的生命周期方法?

如何使用 React Hooks 替代类组件的生命周期方法?

商务合作欢迎私信我 1万+

【React 进阶】函数组件 和 类组件 详解区分

时隔一年半之久再次重新学习 React,好多都还是原来的样子,这次我要重新开启 React 的大门,希望各位小伙伴可以一起讨论学习呦~ 前言 今天我们开启第三个专题:React 中函数组件和类组件的区别。 一、函数组件 和 类组件 1. 函数组件 函数组件也称无状态组件,顾名思义就是以函数形态存在的 React 组件。 在 hooks 出现之前,react 中的函数组件通常只考虑负责UI的渲染,没有自身的状态,没有业务逻辑代码,是一个纯函数。下面这个函数组件就是一个纯函数,它的输出只由参数props.

XH_jing的博客 7836

React 类组件与函数组件的生命周期

React 组件的生命周期分为类组件和函数组件两种形式。类组件的生命周期包括挂载、更新和卸载三个阶段,分别对应 constructor、render、componentDidMount、shouldComponentUpdate、componentDidUpdate 和 componentWillUnmount 等方法。函数组件通过 React Hooks 模拟生命周期,如 useEffect 用于处理挂载、更新和卸载的逻辑,useState 用于状态管理。两者在处理副作用、性能优化和状态更新上有显著差异:

修炼魔法中.... 2379

React 类组件与函数式组件

<p>计数:{this.state.count}</p>

萌新程序员的博客,觉得有用的可以点点关注 678

React-函数式组件VS类组件

函数式组件已成为 React 的主流写法,但理解类组件仍是必备技能(尤其是在维护老项目时)。是构建 UI 的两种主要方式,它们各有特点和适用场景。通过 JavaScript。直接使用生命周期方法(如。使用 useEffect。使用 useState。

qq_44165941的博客 603

react之函数组件、类组件

函数组件是函数式编程,通过接收一个props对象返回一个react元素,特点是不可变的、引用透明且没有副作用等​// )//}​​类组件是面向对象编程,主要是继承和生命周期等核心概念,但面向对象编程将属性和方法封装起来,屏蔽了很多细节,不利于测试,而且react的设计思路更推崇组合,而不是继承,因此在类组件中大量使用继承会造成组件过重,功能难以拆分​render(){return (​data:{},render() {return (<div>

Westrate_WT的博客 1959

React Hook - useEffecfa函数的使用细节详解

Effect Hook 可以让你来完成一些类似于class中生命周期的功能;事实上,类似于网络请求、手动更新DOM、一些事件的监听,都是React更新DOM的一些副作用(Side Effects);所以对于完成这些功能的Hook被称之为 Effect Hook;

m0_71485750的博客 1万+
上一篇: http请求头有哪些?
下一篇: 跨域是什么?有哪些解决跨域的方法和方案?
Mrwang21
博客等级 码龄5年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值