react中的useEffect和useLayoutEffect

文章类型:React

发布者:hp

发布时间:2023-05-11

React 中,useEffect 和 useLayoutEffect 都是用于处理副作用的 Hook。它们都会在组件渲染完毕之后执行

一:区别

1:执行时机不同

useLayoutEffect =>会在组件渲染之后、浏览器 layout 和 paint 之前执行,

useEffect =>在组件渲染之后、浏览器 layout 和 paint 之后执行

2:影响渲染性能的程度不同

useLayoutEffect=> 可能会对组件的渲染性能产生影响,会阻塞

useEffect=> 则不会对组件的渲染性能产生影响

3:适用场景不同

useLayoutEffect=>更适合用于需要同步更新 DOM 的场景,如位置大小等

useEffect=> 更适合用于不需要同步更新 DOM 的场景,如网络请求,数据状态等

二:代码演示

1:useEffect

useEffect(() => {
    console.log('useEffect');
    document.title = `Count: ${count}`;
  }, [count]);

2:useLayoutEffect

useLayoutEffect(() => {
    console.log('useLayoutEffect');
    const handleResize = () => {
      setWidth(window.innerWidth);
      setHeight(window.innerHeight);
    };
    handleResize();
    window.addEventListener('resize', handleResize);
    return () => {
      window.removeEventListener('resize', handleResize);
    };
  }, []);

三:总结

1:组件渲染完成后立即执行某些操作,并且这些操作可能会影响组件的渲染结果,则使用 useLayoutEffect;否则,应该使用 useEffect

2:useEffect 和 useLayoutEffect 的执行顺序不能保证。在同一个组件中使用,它们可能会交错执行

3:useEffect 和 useLayoutEffect 的第二个参数(依赖项)可以控制 执行时机。当依赖项变化时,Hook 会重新执行。如果依赖项为空数组,那么  只在组件渲染时执行一次

4:使用 useLayoutEffect 时,需要注意它可能会对组件的性能(阻塞)产生影响。应该尽可能地减少使用它的次数,只在必要的情况下使用

上一篇DNS原理