useLayoutEffect
其函数签名与 useEffect 相同,但它会在所有的 DOM 变更之后同步调用 effect。可以使用它来读取 DOM 布局并同步触发重渲染。在浏览器执行绘制之前,useLayoutEffect 内部的更新计划将被同步刷新。
尽可能使用标准的 useEffect 以避免阻塞视觉更新。
示例,如果使用 useEffect,会明显有个闪屏问题
这个是用在处理 DOM 的时候,当你的 useEffect 里面的操作需要处理 DOM,并且会改变页面的样式,就需要用这个,否则可能会出现出现闪屏问题, useLayoutEffect 里面的 callback 函数会在 DOM 更新完成后立即执行,但是会在浏览器进行任何绘制之前运行完成,阻塞了浏览器的绘制.
import React, { useEffect, useLayoutEffect, useState } from "react";
function BoxDemo() {
const [currStyle, setCurrStyle] = useState({
"100px",
height: "100px",
backgroundColor: "red",
position: "absolute",
top: "0px",
left: "0px",
});
// useLayoutEffect(() => {
// setCurrStyle({
// ...currStyle,
// position: "absolute",
// top: "0px",
// left: "100px",
// });
// }, []);
useEffect(() => {
setCurrStyle({
...currStyle,
position: "absolute",
top: "0px",
left: "100px",
});
}, []);
const onButtonClick = () => {};
return (
<>
<div style={currStyle}>我是box</div>
</>
);
}
export default BoxDemo;