在 React 中,为什么使用 useEffect 时有时需要返回一个清理函数?它的执行时机是怎样的?
在 React 中,为什么使用 useEffect 时有时需要返回一个清理函数?它的执行时机是怎样的?
答:
在 React 中,useEffect 的清理函数用于执行副作用的“清理”操作,比如取消订阅、清除定时器、关闭 WebSocket 连接等,以避免内存泄漏或无效操作。
执行时机如下:
- 组件卸载时:如果 useEffect 中返回了一个函数,React 会在组件从 DOM 中移除(卸载)之前调用该清理函数。
- 下一次 effect 执行前(针对依赖项变化的情况):如果 useEffect 指定了依赖项数组(deps),并且依赖项发生变化,React 会在重新运行 effect 之前先调用上一次 effect 返回的清理函数。
示例:
useEffect(() => {
  const timer = setInterval(() => {
    console.log('Tick');
  }, 1000);
  // 清理函数
  return () => {
    clearInterval(timer);
  };
}, []);
在这个例子中,清理函数确保组件卸载时清除定时器,避免在已卸载组件上执行 setState 引发警告或错误。
总结:
清理函数的作用是确保副作用被正确释放,防止资源浪费或状态不一致。它的调用时机取决于 effect 是否重复执行:每次 effect 重新运行前(如果有依赖项变化)或组件卸载时。

发表评论 (审核通过后显示评论):