React中useLayoutEffect和useEffect的区别
重点: 1.二者函数签名相同,调用方式是一致的
2. 怎么简单进行选择: 无脑选择useEffect,除非运行效果和你预期的不一致再试试useLayoutEffect
区别详解:
useEffect是异步执行,而且是在渲染被绘制到屏幕之后执行。
流程如下:
你以某种方式触发了rerender(改变state,或者父组件发生rerender)
React渲染你的组件(调用组件函数)
屏幕在视觉上更新(真实dom操作)
然后useEffect运行
useLayoutEffect是同步执行,时机在渲染之后但在屏幕更新之前。
流程如下:
你以某种方式触发了rerender(改变state,或者父组件发生rerender)
React渲染你的组件(调用组件函数)
useLayoutEffect运行,React等待它完成
屏幕在视觉上更新(真实dom操作)
代码实战:
const BlinkyRender = () => {
  const [value, setValue] = useState(0);
  useLayoutEffect(() => {
    if (value === 0) {
      setValue(10 + Math.random() * 200);
    }
  }, [value]);
  console.log('render', value);
  return (
    <div onClick={() => setValue(0)}>
      value: {value}
    </div>
  );
};
当点击div时,状态立即改变(value重置为0),这将重新Render组件,然后运行Effect——将值设置为某个随机数,并再次重新Render。
也就是是两次Rerender会快速连续发生。分别换用useLayoutEffect和useEffect观察有什么不同。
你会发现useLayoutEffect的版本会在组件render两次的情况下仅在视觉上更新一次。而useEffect版本在视觉上也会呈现两次,所以会看到闪烁,从0闪烁变成对应的随机数。
所以到底什么时候使用useLayoutEffect呢?
如果你的组件在状态更新时闪烁,比如它首先以部分就绪状态呈现,然后立即以最终状态重新呈现——这是一个很好的线索,是时候换useLayoutEffect了。
当您的更新是两步(或多步)过程时,就会出现这种情况。你想在重新绘制屏幕之前一起批处理多个更新吗,试试useLayoutEffect。
在大多数情况下,你的effect函数会在对应的依赖项如state或props改变时执行,而对应的回调逻辑往往不会立即影响或根本不影响页面视觉。
比如发一个ajax请求
或者你设置一个了事件处理器
大多数时候,使用useEffect是正确的。如果您的代码导致闪烁,切换到useLayoutEffect,看看是否有帮助。
因为useLayoutEffect是同步的,也就是阻塞的,在你的effect运行完之前,视觉不会更新。如果你的effect中有计算密集型代码,它可能会导致性能体验问题,比如卡顿。大多数effect在运行时并不需要"stop the world",普通的 useEffect几乎可以满足我们所有的需求。
React中useLayoutEffect和useEffect的区别的更多相关文章
- React中useMemo与useCallback的区别
		
useMemo 把"创建"函数和依赖项数组作为参数传⼊入useMemo,它仅会在某个依赖项改变时才重新计算memoized 值.这种优化有助于避免在每次渲染时都进⾏行行⾼高开销的计 ...
 - React中state和props的区别
		
props和state都是用于描述component状态的,并且这个状态应该是与显示相关的. State 如果component的某些状态需要被改变,并且会影响到component的render,那么 ...
 - react中constructor和super()以及super(props)的区别。
		
react中这两个API出镜率超级高,但是一直不太懂这到底是干嘛的,有什么用:今天整理一下,方便自己查看同时方便大家. 1.constructor( )-----super( )的基本含义 const ...
 - React中props.children和React.Children的区别
		
在React中,当涉及组件嵌套,在父组件中使用props.children把所有子组件显示出来.如下: function ParentComponent(props){ return ( <di ...
 - React Hook:使用 useEffect
		
React Hook:使用 useEffect 一.描述 二.需要清理的副作用 1.在 class 组件中 2.使用 effect Hook 的示例 1.useEffect 做了什么? 2.为什么在组 ...
 - 解读vue-server-renderer源码并在react中的实现
		
前言  在博客开发的过程中,有这样一个需求想解决,就是在SSR开发环境中,服务端的代码是是直接通过webpack打包成文件(因为里面包含同构的代码,就是服务端与客户端共享前端的组件代码),写到磁盘里 ...
 - Immutable 详解及 React 中实践
		
本文转自:https://github.com/camsong/blog/issues/3 Shared mutable state is the root of all evil(共享的可变状态是万 ...
 - React中的路由系统
		
React中的路由系统 提起路由,首先想到的就是 ASPNET MVC 里面的路由系统--通过事先定义一组路由规则,程序运行时就能自动根据我们输入的URL来返回相对应的页面.前端中的路由与之类似,前端 ...
 - React 深入系列1:React 中的元素、组件、实例和节点
		
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
 
随机推荐
- (数据科学学习手札96)在geopandas中叠加在线地图
			
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...
 - matlab中reshape 重构数组
			
来源:https://ww2.mathworks.cn/help/matlab/ref/reshape.html?searchHighlight=reshape&s_tid=doc_srcht ...
 - Linux为STDOUT的关键字设置颜色
			
echo "颜色测试aaa实测" | perl -pe 's/(aaa|实|测)/\e[1;31m$1\e[0m/g'
 - Java安全之Commons Collections1分析前置知识
			
Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...
 - CPU 执行程序的秘密,藏在了这 15 张图里
			
前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...
 - RHSA-2018:3665-重要: NetworkManager 安全更新
			
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
 - ORA-00017: session requested to set trace event  请求会话以设置跟踪事件
			
ORA-00017: session requested to set trace event ORA-00017: 请求会话以设置跟踪事件 Cause: The current se ...
 - devops-jenkins分布式构建
			
1. devops-jenkins分布式构建 1) 点击系统管理 进入节点管理 2) 点击新建节点 3) 进行节点配置在node节点服务器配置,进行java的安装 [root@nginx-backup ...
 - MeteoInfoLab脚本示例:数据投影-FLEXPART
			
FLEXPART是一个类似HYSPLIT的扩散模式,它输出的netcdf文件参照了WRF,可惜全局属性没有写全,比如只有一个投影名称(例如Lambert),没有相关的投影参数:中央经度,标准纬度等等. ...
 - C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
			
循环链表 把链表的两头连接,使其成为了一个环状链表,通常称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,链表就能成环儿,下图所示. 需要注意的是,虽然循环链表成环 ...