useEffect 和 useLayoutEffect浅析
执行时期的区别
useEffect 回调函数的执行时期
useEffect为异步执行,执行时期为
- 触发状态更新(如:setState,forceUpdate)
- React渲染函数执行(render)
- 将更新渲染到页面上
- 执行useEffect回调函数
useLayoutEffect 回调函数的执行时期
- 触发更新
- React渲染函数执行
- 同步执行 useLayoutEffect回调函数 (如果此函数中存在 触发更新操作,如setState,会放弃本阶段的页面渲染,先执行更新然后再统一进行渲染)
- 将更新渲染到页面上
对比后得到两者区别
执行时期的区别,useEffect回调是在更新渲染到页面以后异步执行 而 useLayoutEffect是在更新渲染在页面前同步执行。造成的影响是,useLayoutEffect 回调中如果有耗时操作会阻塞页面的渲染,造成性能问题。
两者中如果调用setState更新状态,都会再次执行render,区别是 useEffect会进行两次页面更新渲染,useLayoutEffect只会执行最后一次页面更新渲染。所以,看到的结果是使用useEffect时候执行更新页面上会出现闪烁,而useLayoutEffect确不会
useLayoutEffect 的执行时期 同 class组件生命周期 componentDidMount 和 componentDidUpdate
所以,得出的结论是,大多数的场景中都应该使用useEffect来实现我们的逻辑,仅仅在一些特殊情况,比如需要去监听同步更新状态防止页面煽动时才需要useLayoutEffect。
useEffect 和 useLayoutEffect浅析的更多相关文章
- React的useEffect与useLayoutEffect执行机制剖析
引言 useEffect和useLayoutEffect是React官方推出的两个hooks,都是用来执行副作用的钩子函数,名字类似,功能相近,唯一不同的就是执行的时机有差异,今天这篇文章主要是从这两 ...
- React中useLayoutEffect和useEffect的区别
重点: 1.二者函数签名相同,调用方式是一致的 2. 怎么简单进行选择: 无脑选择useEffect,除非运行效果和你预期的不一致再试试useLayoutEffect 区别详解:useEffect是异 ...
- 精读《setState 做了什么》
1 引言 setState 是 React 框架最常用的命令,它是用来更新状态的,这也是 React 框架划时代的功能. 但是 setState 函数是 react 包导出的,他们又是如何与 reac ...
- Preact(React)核心原理详解
原创: 宝丁 玄说前端 本文作者:字节跳动 - 宝丁 一.Preact 是什么 二.Preact 和 React 的区别有哪些? 三.Preact 是怎么工作的 四.结合实际组件了解整体渲染流程 五. ...
- React Hooks用法大全
前言 在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖 ...
- React源码 commit阶段详解
转: React源码 commit阶段详解 点击进入React源码调试仓库. 当render阶段完成后,意味着在内存中构建的workInProgress树所有更新工作已经完成,这包括树中fiber节点 ...
- PReact10.5.13源码理解之hook
hook源码其实不多,但是实现的比较精巧:在diff/index.js中会有一些optison.diff这种钩子函数,hook中就用到了这些钩子函数. 在比如options._diff中将curr ...
- react之react Hooks
函数组件,没有 class 组件中的 componentDidMount.componentDidUpdate 等生命周期方法,也没有 State,但这些可以通过 React Hook 实现. Rea ...
- ahooks 中那些控制“时机”的hook都是怎么实现的?
本文是深入浅出 ahooks 源码系列文章的第五篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本文来探索一下 ahooks 是怎么封装 React 的一些执行& ...
随机推荐
- 合并表格行---三层for循环遍历数据
合并表格行---三层for循环遍历数据 示例1 json <!DOCTYPE html> <html lang="zh_cn"> <head> ...
- SDK和API的直接区别
狭义的说法,在实际工作中, 如果对方需要你提供一个api,是指一个工程提供给另外一个工程的接口(一般是基于http协议). 如果对方需要你提供一个sdk,是指基于对方工程的编程语言,提供一个代码包.在 ...
- 万答#19,MySQL可以禁用MyISAM引擎吗?
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MyISAM的适用场景越来越少了. 随着MySQL 8.0的推出,系统表已经全面采用InnoDB引擎,不再需要MyISAM ...
- 【Meetup回顾】Apache DolphinScheduler在联通的实践和二次开发经验分享
在由 openLooKeng 社区主办,Apahce DolphinScheduler社区.Apache Pulsar 社区.示说网协办的联合 Meetup 上,来自联通数字科技的王兴杰老师分享了Do ...
- React报错之Functions are not valid as a React child
正文从这开始~ 总览 产生"Functions are not valid as a React child. This may happen if you return a Compone ...
- HDU3085 Nightmare Ⅱ (双向BFS)
联赛前该练什么?DP,树型,状压当然是爆搜啦 双向BFS就是两个普通BFS通过一拼接函数联系,多多判断啦 #include <iostream> #include <cstdio&g ...
- LuoguP1725 琪露诺 (动态规划)
\(单调队列\) 或 \(堆\) 优化 #include <iostream> #include <cstdio> #include <cstring> #incl ...
- Java多线程开发系列之五:Springboot 中异步请求方法的使用
Springboot 中异步线程的使用在过往的后台开发中,我们往往使用java自带的线程或线程池,来进行异步的调用.这对于效果来说没什么,甚至可以让开发人员对底层的状况更清晰,但是对于代码的易读性和可 ...
- Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动
系列文章目录 第一章:武装飞船 06:让飞船移动 一.驾驶飞船 下面来让玩家能够左右移动飞船.我们将编写代码,在用户按左或右箭头键时做出响应.我们将首先专注于向右移动,再使用同样的原理来控制向左移动. ...
- java数组---概念
1.数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 2.数组的建 ...