如何使 React 中的 useEffect、useLayoutEffect 只调用一次

  Hook 是 React 16.8 的新增特性,旨在替代原来 React 中的 Class 组件。React 官方已经对使用 Class 组件采取了负面态度(见此处)。虽然目前官方仍然明确声明“没有计划从 React 中移除 class”(见此处),但待 Hook 成熟之后,Class 组件语法被废弃恐怕是迟早的事情。

  useEffectuseLayoutEffect 可用于替代 Class 组件生命周期的方法。通常,它们都会反复执行。有时候,这会导致死循环。

  使 useEffectuseLayoutEffect 只调用一次的方法是,向它们传入第二个空数组参数。如:

useEffect(() => init(), []);

【踩坑提醒】

  不要使用如下途径来使 useEffectuseLayoutEffect 只调用一次。

let didInit = false;
useEffect(() => {if (!didInit) {didInit = true; // didInit 放在哪里都不会起作用init();didInit = true; // didInit 放在哪里都不会起作用}
});

  有过多线程并发编程经验的人应该知道,上面的 didInit 将不起作用,且程序可能将在初始化时陷入死循环。虽然客户端 JavaScript 是单线程的,但由于 JavaScript 有异步语法,上述代码仍然会造成对 didInit 的异步并发访问,导致 didInit 不起作用。由于 useEffect 可以被反复触发,如果上述的函数 init() 进行了对 state 的异步更新,这将导致对 useEffect 的持续循环触发。

  由于 JavaScript 不支持多线程锁,所以它无法使用 双重检查锁定。因此,在 React 中,不要自作聪明编写这种坏代码。


  如果想知道更多关于从 Class 组件到 Hook 的重构方法,可见:https://react.docschina.org/docs/hooks-faq.html#from-classes-to-hooks

如何使 React 中的 useEffect、useLayoutEffect 只调用一次相关推荐

  1. React中MUI初始化和方法调用

    React中MUI初始化和方法调用 step1:引用 npm install @mui/material @emotion/react @emotion/styled step2:D:\vue\unt ...

  2. react中使用AlipayJSBridge 支付宝支付调用接口在H5网页的应用

    支付宝文档: https://opendocs.alipay.com/open/ 我用的是第二种,如下: AlipayJSBridge在支付宝里才能唤起 主要流程:我们做的是支付宝连续包月自动续费,因 ...

  3. react中样式冲突_如何通过React中的样式使您的应用漂亮

    react中样式冲突 by Vinh Le 由Vinh Le 如何通过React中的样式使您的应用漂亮 (How to make your apps pretty with styling in Re ...

  4. React中useEffect使用

    之前我们已经掌握了useState的使用,在 class 中,我们通过在构造函数中设置 this.state 为 { count: 0 } 来初始化 count state 为 0: class Ex ...

  5. react中副作用函数(useEffect)详解

    先简单说一下常见的useEffect使用方式 三种 useEffect(() => {// 副作用函数的内容 }) 每次更新之后都要执行 -------------------- useEffe ...

  6. React中使用富文本编辑器Quill,支持粘贴图片

    最近项目中需要用到富文本编辑器,并且客户明确提出需要实现可以直接截图粘贴到文本框中. 由于我们的前端是用react写的,于是就去参考了知乎的实现,发现知乎的富文本框是可以直接贴图进去的,但由于看不到源 ...

  7. 我们应该如何优雅的处理 React 中受控与非受控

    受控 & 非受控 今天来和大家简单聊聊 React 中的受控和非受控的概念. 提到受控和非受控相信对于使用过 React 的朋友已经老生常谈了,在开始正题之前惯例先和大家聊一些关于受控 &am ...

  8. 干货 | React 中的 Canvas 动画

    作者简介 掺水的酱油,携程软件技术专家,关注大前端及移动端相关技术. 移动端硬件性能越来越好的今天,页面的交互也越来越丰富,Web 体验在不断向原生应用靠拢,加入了越来越多的手势与动画.除了常见的 C ...

  9. boost::unorder_map如何插入元素_「React」如何在React中优雅的实现动画

    最简单的动画组件实现 动画的本质,无非就是一个状态样式到另一个状态样式的过渡.最简单的动画组件,我们只需要指定两个状态的样式(进入的样式,离开的样式),以及一个开关(控制状态),即可完成. codep ...

最新文章

  1. .NET软件开发, 你应该知道 (整)
  2. Dockerfile中通过ENV指定动态参数在RUN时传递参数(部署后台jar包时指定端口为例)
  3. 卸载。net开发的服务
  4. vue 新版本 webpack 代理 跨域设置
  5. pojo类中list存储其他字段_List集合流处理类型小结
  6. 【API进阶之路】无法想象!大龄码农的硬盘里有这么多宝藏
  7. esp8266 扫描wifi_基于ESP8266与QT的智能家居控制系统设计
  8. 2010年初的一点随想
  9. 小米/VIVO/OPPO全系列救砖+解锁+工具+教程+激活账户技术
  10. 科大讯飞语音合成的引入
  11. 怎么样使prestashop 运行速度更快
  12. 安装ubuntu系统,保留原始分区数据
  13. FinsTCP协议报文详细分析
  14. HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
  15. 情绪管理---第二课:情绪包含四方面的反应
  16. 人工智能实验1-波士顿房价预测
  17. Python智力问答小游戏
  18. 西安电子科技大学计算机复试题目,西安电子科技大学考研复试 微机原理练习题...
  19. 语义分割中的mIoU计算函数解读
  20. java的jar文件

热门文章

  1. 【Java并发编程】java并发框架Executor学习笔记
  2. 【Spring学习】Spring的AOP模块应用详解
  3. WebRTC通话质量调优:三个弱网模拟测试工具的使用与对比
  4. 浅析Mysql InnoDB存储引擎事务原理
  5. 读配置文件能够保持顺序的 Java Properties 类
  6. ssh报错:Could not load host key:/etc/ssh/ssh_host_rsa_keyssh_host_ecdsa_keyssh_host_ed25519_key...
  7. 《Angular从零到一》导读
  8. 分布式系统之通信技术学习
  9. CecOS v1.4 中文企业云操作系统 管理员及用户指南发布
  10. ie6常见css bug