useEffect和useLayoutEffect的区别

111 阅读1分钟

主要区别

useLayoutEffect是useEffect的一个版本,两者最主要的区别是,执行时机。

详细解释

useEffect是异步宏任务,在下一轮事件循环才会执行。而GUI渲染和JS线程是互斥的,也就是说,在Effect 运行前,浏览器就已经进行了屏幕渲染,渲染完毕后,useEffect才会被任务队列取出来,开始执行。

useLayoutEffect是同步任务,在页面重新绘制前就会执行内部的回调函数,会阻塞页面的渲染。

useLayoutEffect的使用场景

在浏览器重绘前计算布局(官网以toolTip组件为例)

  const ref = useRef(null);
  const [tooltipHeight, setTooltipHeight] = useState(0); // 你还不知道真正的高度
​
  useLayoutEffect(() => {
    const { height } = ref.current.getBoundingClientRect();
    setTooltipHeight(height); // 现在重新渲染,你知道了真实的高度
  }, []);
​
  // ... 在下方的渲染逻辑中使用 tooltipHeight ...
}