我正试图向另一位工程师解释Reaction StrictMode是如何工作的--特别提到了双重渲染、间隔和Use Effect清理.

以以下简单的计数器组件为例:

const Counter = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const id = setInterval(() => {
      setCount((old) => old + 1);
    }, 3000);
    return () => clearInterval(id);
  }, []);

  console.log("RE_RENDERING");
  return <div>{count}</div>;
};

然后将其挂载到使用StrictMode的应用程序中:

export default function App() {
  return (
    <StrictMode>
      <Counter />
    </StrictMode>
  );
}

我们了解严格模式导致对触发效果做出react ,并且渲染两次,并且

react 始终在下一次渲染效果之前清除上一次渲染的效果.

(逐字引用自https://react.dev/learn/synchronizing-with-effects).

我正在努力解释的是,为什么控制台日志(log)"RE_RENDERING"仍然每3秒以2为一批触发--即使我们正在清理setInterval作为useEffect()的一部分.例如,应该清理在第一个渲染中创建的setInterval,只留下第二个间隔.

当然,当我们移除<StrictMode>-"RE_RENDERING"时,每隔3秒可靠地emits 一次.我只能假设状态Mutations ,以某种方式触发了第二个setInterval的创建,但它没有被清理-但我不知道如何解释为什么或如何发生这种情况.

code sandbox link

推荐答案

你引用的文件中的一部分实际上具有误导性.如果您将console.log添加到您的清理函数中,您会注意到它只被调用一次:当组件由于StrictMode:

每当组件首次挂载时,此新判断将自动卸载并重新挂载每个组件,从而在第二次挂载时恢复以前的状态.

但是,如果将count添加到依存关系数组中,则每次渲染时都会调用Cleanup函数.文件中提到了这一点,on the same example you used(强调我的):

现在你的成绩是c => c + 1分,而不是count + 1分,your Effect no longer needs to depend on count分.As a result of this fix, it won’t need to cleanup and setup the interval again every time the 103 changes.

至于你的问题,你自己说过:StrictMode将成为你的组件re-render an extra time.您每3秒更新一次状态,因此组件每3秒重新呈现两次.如果同时运行多个间隔,则为here is what it would really do.

Reactjs相关问答推荐

在迁移到Redux—Toolkit 2.0和Redux5.0之后,我在extraReducer和Slice方面有点挣扎,

为什么安装FLOBIT后,所有的输入FIELD现在都有一个蓝色的轮廓?

安装后未渲染tailwind

Reaction Ploly:如何在多个子情节中共享zoom 状态

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

可以使用mode.css/mode.scss引用常规的类名吗?

为什么react日历时间轴项Renderprops 不能与useState挂钩一起使用?

useState数组不更新

在 CrafterCMS Studio 中拖动字段

从 React 应用程序调用未经身份验证的 graphql 查询时出现错误:没有当前用户

React 测试库包装器组件

如何使用 React Hook Form 将寄存器作为 props 发送到子组件来收集数据?

如何避免在 react useEffect 上滚动时出现小的延迟?

理解 React 中的 PrevState

将 dict 值转换并插入到react 钩子的列表中

如果 URL 已随功能组件更改,则取消刷新

Lodash 在命名导入中导入整个包

当页面重新加载react 路由导航到第一页 v6

axios post方法中的请求失败,状态码为500错误

Context Api React 的问题