useEffect和useLayoutEffect
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了useEffect和useLayoutEffect相关的知识,希望对你有一定的参考价值。
参考技术A使用 useEffect 完成副作用操作。赋值给 useEffect 的函数会在组件渲染到屏幕之后执行。你可以把 effect 看作从 React 的纯函数式世界通往命令式世界的逃生通道。
清除 effect
通常,组件卸载时需要清除 effect 创建的诸如订阅或计时器 ID 等资源。要实现这一点,useEffect 函数需返回一个清除函数
为防止内存泄漏,清除函数会在组件卸载前执行。另外,如果组件多次渲染(通常如此),则在执行下一个 effect 之前,上一个 effect 就已被清除。在上述示例中,意味着组件的每一次更新都会创建新的订阅。
effect 的执行时机
与 componentDidMount、componentDidUpdate 不同的是,传给 useEffect 的函数会在浏览器完成布局与绘制 之后 ,在一个延迟事件中被调用。这使得它适用于许多常见的副作用场景,比如设置订阅和事件处理等情况,因为绝大多数操作不应阻塞浏览器对屏幕的更新。
并非所有 effect 都可以被延迟执行。例如,一个对用户可见的 DOM 变更就必须在浏览器执行下一次绘制前被同步执行,这样用户才不会感觉到视觉上的不一致。(概念上类似于被动监听事件和主动监听事件的区别。)React 为此提供了一个额外的 useLayoutEffect Hook 来处理这类 effect。它和 useEffect 的结构相同,区别只是调用时机不同。
其函数签名与 useEffect 相同,但它会在所有的 DOM 变更之后 同步 调用 effect。可以使用它来读取 DOM 布局并同步触发重渲染。 在浏览器执行绘制之前 ,useLayoutEffect 内部的更新计划将被同步刷新。
尽可能使用标准的 useEffect 以避免阻塞视觉更新
栗子
可以清楚的看到有一个一闪而过的方块.
useLayoutEffect 可以看出,每次刷新,页面基本没变化
以上是关于useEffect和useLayoutEffect的主要内容,如果未能解决你的问题,请参考以下文章
useEffect和useLayoutEffect有什么区别?
useEffect和useLayoutEffect有什么区别?
useEffect和useLayoutEffect有什么区别?