useEffect() 的 4 种方法

2025-06-10

useEffect() 的 4 种方法

又一篇关于最常用的 React Hooks 的文章。我不会过多地讲解它的工作原理,而是会写一些示例和模式,以便快速回顾如何以及何时使用它。

它是什么?

它是一个钩子,允许在函数组件内部产生副作用。它接受一个函数作为第一个参数,一个依赖项数组作为第二个参数:

React.useEffect(fn, [deps])`

它在渲染中被调用,如下所示:

  • 准备当前状态的 UI
  • 渲染结果,即<div>Hello World!</div>
  • 将结果提交给 DOM
  • 浏览器绘制屏幕
  • React 调用 useEffect()

在渲染周期的最后阶段,useEffect()会使用本次调用的状态、处理程序和效果进行调用。因此,每次渲染都会有其特定的属性,这些属性永远不会改变,但 React 始终会应用最后一次渲染的结果。

何时以及如何使用它

它与类组件的生命周期方法略有不同。主要区别在于,生命周期方法始终引用最新状态,而useEffect()每次渲染都会更新状态、处理程序和效果,并且每次渲染都会有所不同。但好处在于,你可以通过指定依赖列表或不指定依赖列表来
控制何时调用内部函数。useEffect()

我想到了调用该方法的四种可能方式:

  • 一次,当组件安装时
  • 在每个组件渲染时
  • 在每个组件渲染时都带有条件
  • 当组件卸载时

当组件安装时

通常,你会用它来获取数据或添加事件监听器。
要运行该函数一次,请添加一个空的依赖项列表。如果列表中没有依赖项,则意味着它将始终保持不变,并且不会再次调用该函数。

function MyComponent() {
    // ...
    React.useEffect(() => {
        callMeOnlyOnce()
    }, [])
    // ...
}

在每个组件上渲染

要在每次组件渲染时调用该函数,请跳过添加依赖项列表的步骤。没有列表,就没有可比较的对象,这意味着每次都会运行该效果。

function MyComponent() {
    // ...
    React.useEffect(() => {
        runThisFunctionOnEveryRender();
    })
    // ...
}

每个组件渲染时都需设置条件

要有条件地调用函数,请指定依赖项列表。
经验法则是始终在 .js 文件中添加您正在使用的依赖项useEffect()

function MyComponent() {
    // ...
    React.useEffect(() => {
        runIfOneOfTheDepsWillChange(dep1, dep2);
    }, [dep1, dep2])
    // ...
}

当组件卸载时

为了在组件卸载后进行清理(删除事件监听器或停止具有副作用的数据提取),应在useEffect()钩子内添加带有函数的返回语句。

function MyComponent() {
    // ...
    React.useEffect(() => {
        document.addEventListener();

        return () => {
            document.removeEventListener();
        }
    }, [])
    // ...
}

外卖

本文的要点是始终指定效果中使用的依赖项。这将防止无条件运行效果,从而避免无限循环和性能问题。

鏂囩珷鏉ユ簮锛�https://dev.to/spukas/4-ways-to-useeffect-pf6
PREV
JavaScript 中的错误处理
NEXT
useReducer 与 useState 对比 选择 useReducer() 而非 useState() 的 3 个理由