如何在 React 中实现一个自定义 Hook 来跟踪组件是否已挂载(mounted)?

如何在 React 中实现一个自定义 Hook 来跟踪组件是否已挂载(mounted)?

回答:
可以使用 useRef 和 useEffect 创建一个自定义 Hook,例如 useIsMounted,来跟踪组件的挂载状态:

import { useRef, useEffect } from 'react';

function useIsMounted() {
  const isMounted = useRef(false);

  useEffect(() => {
    isMounted.current = true;
    return () => {
      isMounted.current = false;
    };
  }, []);

  return isMounted;
}

使用方式:

function MyComponent() {
  const isMounted = useIsMounted();

  useEffect(() => {
    const fetchData = async () => {
      const data = await someAsyncOperation();
      if (isMounted.current) {
        // 安全地更新状态
        setData(data);
      }
    };
    fetchData();
  }, []);

  // ...
}

解析:
在 React 中,组件卸载后仍尝试调用 setState 会导致警告甚至潜在错误(尤其在异步操作如 fetch、setTimeout 中)。虽然 React 18+ 在开发模式下会自动忽略卸载组件的 setState 警告,但在某些场景(如避免不必要的状态更新或内存泄漏)仍需手动判断组件是否已挂载。

useRef 用于存储可变值且不会触发重新渲染。useEffect 在组件挂载时将 isMounted.current 设为 true,卸载时设为 false。这样在异步回调中可通过 isMounted.current 判断组件是否仍处于挂载状态,从而安全更新状态。

注意:React 官方并不推荐频繁使用这种模式,更推荐使用 AbortController(用于 fetch)或清理函数来取消副作用,但 useIsMounted 在某些遗留代码或特定场景下仍具实用价值。

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

昵称:
邮箱:
内容: