useEffect 和 useLayoutEffect


今天无意中看到了 useLayoutEffect这个生命周期,这个倒从来没用过,果断了解了一下。

React Hooks 为函数组件提供了状态和生命周期特性,使得在不编写类组件的情况下管理状态变得更加方便。useEffectuseLayoutEffect 是React中的两个Hook,用于处理组件的副作用,例如数据获取或手动更改DOM等。

useEffect

useEffect 相当于类组件中的 componentDidMountcomponentDidUpdatecomponentWillUnmount 生命周期方法的组合。它允许你在函数组件中执行副作用操作。

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { useEffect } from 'react';

function MyComponent({ someValue }) {
useEffect(() => {
// 副作用代码
console.log('副作用执行了,且someValue为:', someValue);

// 卸载时会执行的函数
return () => {
console.log('组件卸载时执行');
};
}, [someValue]); // 依赖项数组

return <div>My Component</div>;
}

在上面的例子中,只有当 someValue 发生变化时,useEffect 内的代码才会执行。通过返回一个函数,可以在组件卸载时执行操作,这类似于 componentWillUnmount

useLayoutEffect

useLayoutEffectuseEffect 类似,但它会在DOM更新后同步执行副作用,注意这里是同步。这意味着useLayoutEffect内的代码会在浏览器绘制之前执行,这可能会导致性能问题,因为它阻塞了视图的渲染。

基本用法

1
2
3
4
5
6
7
8
9
10
import { useLayoutEffect } from 'react';

function MyComponent({ someValue }) {
useLayoutEffect(() => {
// 同步副作用代码
console.log('同步副作用执行了,且someValue为:', someValue);
}, [someValue]); // 依赖项数组

return <div>My Component</div>;
}

选择 useEffect 还是 useLayoutEffect?

基本上我们都是优先使用 useEffect,因为它更加灵活且不阻塞渲染。useLayoutEffect 应该只在需要同步读取DOM信息并立即重渲染时使用,比如动态调整子元素的大小。

性能考虑

  • useEffect 会在组件更新后异步执行,这意味着它不会阻塞浏览器的绘制过程。
  • useLayoutEffect 会同步执行,这在DOM更新后立即执行副作用时非常有用,但可能会导致性能问题。

ok这样我们就了解了useLayoutEffectuseEffect的区别了,合理使用的话就可以优化我们的项目。

我的微信公众号: 梨的前端小屋


文章作者: 梨啊梨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梨啊梨 !
  目录