在 React 组件外部的 useEffect 钩子中创建的 clearInterval

clearInterval created in useEffect hook from outside React component

我有这段代码,我想从这个组件外部清除 clearInterval(假设我使用调用 clearInterval 函数的 onClick 方法呈现一个按钮)。 我试图将间隔值作为参考传递,但是一旦状态更新,这个值就会改变。

  useEffect(() => {
    (intervalRef.current as ReturnType<typeof setInterval> | undefined) = setInterval(() => {
      fetch().then((items) => {
        items.forEach((item, id) => {
         // set state based on the values
        });
      });
    }, 5000);

    return () => clearInterval(intervalRef.current);
  }, [state]);

我也收到了 return () => clearInterval(intervalRef.current) 的 eslint 警告,所以我假设它也不会在这个方法中正确清除。

"ref 值 'intervalRef.current' 可能会在这个 effect 清理函数运行时发生变化。如果这个 ref 指向一个由 React 渲染的节点,复制 'intervalRef.current' 到 effect 中的一个变量,并在清理函数中使用该变量。"

React 中此类问题的正确处理方法是什么?

useEffect(() => {
    const intervalId = setInterval(() => {
      fetch().then((items) => {
        items.forEach((item, id) => {
         // set state based on the values
        });
      });
    }, 5000);

    return () => clearInterval(intervalId);
}, [state]);

如果您只想在卸载时清除间隔,则无需将其设为引用。只需将其分配给一个变量并将其传递给您的清理函数即可。

注意:我看到您正计划在 promise 中进行状态更新。您可能 运行 遇到卸载组件然后触发尝试更新状态的 promise 回调的问题。所以也许放一个 isMounted 检查

"The ref value 'intervalRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'intervalRef.current' to a variable inside the effect, and use that variable in the cleanup function."

这是说要在 useEffect 钩子的回调闭包中保存对 ref 值的引用,以在清理函数中使用。

useEffect(() => {
  (intervalRef.current as ReturnType<typeof setInterval> | undefined) = setInterval(() => {
    fetch().then((items) => {
      items.forEach((item, id) => {
       // set state based on the values
      });
    });
  }, 5000);

  const timerId = intervalRef.current;

  return () => clearInterval(timerId);
}, [state]);

如果您需要或想要从组件范围内的任何其他位置清除间隔,只需像通常使用当前引用值那样清除间隔即可:

clearInterval(intervalRef.current);