javascript - React Hook 实现导致并排计数变慢

标签 javascript reactjs react-hooks

当第一个功能组件在 React 应用程序中并排组合时,为什么第一个功能组件比第二个功能组件慢并且您切换选项卡然后在几秒钟后返回它

这是一个沙盒,您可以看到它的运行情况。

https://codesandbox.io/s/useeffect-87pm7

function SlowerCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setCount(count + 1);
    }, 1000);

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

  return <div>The count is: {count}</div>;
}
function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setCount(count => ++count);
    }, 1000);

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

  return <div>The count is: {count}</div>;
}

最佳答案

问题在于,在第二个 useEffect 中,您在每次渲染时设置并清除了一个新的间隔,而其他人则继续在同一个实例上运行。

causes a different effect on the interval when you switching tabs ,因此,useEffect 逻辑对浏览器选项卡工作方式的理解 导致了“错误”。

尝试为 useEffect 中的每个清除函数添加日志记录:

function SuggestedWayToUseEffectOneButItsActuallyNotWorkingCorrectly() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    const intervalId = setInterval(() => {
      setCount(count + 1);
    }, 1000);

    return () => {
      console.log('cleared 2');
      clearInterval(intervalId);
    };
  }, [count]);

  return <div>The count is: {count}</div>;
}

Edit useEffect

关于javascript - React Hook 实现导致并排计数变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58835369/

相关文章:

javascript - 如何知道鼠标是否在窗口内?

javascript - jQuery - 复选框不更新文本

javascript - 准备好在 DOM 之外绑定(bind)事件了吗?

ReactJS/Nivo Graphs - 当数据包含 "incomplete"数据时,如何将 x 轴修改为升序日期顺序?

javascript - 如何从对象类型 State 的字段捕获 onChange 事件

reactjs - 即使值(第二个参数)与前一个值相同,我如何执行 useEffect - React

javascript - 即使在javascript中的页面刷新时,如何保留范围 slider 的最后拖动位置

javascript - 组件接收到 React Prop 但未在 JSX 中更新

javascript - react 意外 token : operator (<)

javascript - React 自定义 Hook 问题 - 无限依赖循环