【问题标题】:react useEffect not trigger when deps change in concurrent/suspense mode当 deps 在并发/悬念模式下发生变化时,react useEffect 不会触发
【发布时间】:2022-08-14 20:28:06
【问题描述】:

显然第67行在功能组件中记录count,在第69行count被记录生效,据我了解,功能组件中的count和效果应该永远同步,但事实并非如此

当count从3变成4时,useEffect没有触发,怎么会这样 有什么与并发/悬念有关的吗?

看起来很像反应中的错误,还是我遗漏了任何细节?

  • 你能分享一下,你是如何初始化你的计数的?
  • @SujithSandeep 还没有找到可靠地重现这种行为的模式。这应该绝不无论如何都会发生。任何可能的原因都受到高度赞赏
  • 如果您将 count 创建为变量(即)Let count = 1;,则可能会发生这种情况。你已经创建了const [count, setCount] = useState(0)。只有当 state 或 props 改变时,组件的重新渲染才会发生。只有当重新渲染发生时,useEffect 才会生效。在您的情况下,如果组件重新渲染,则 useEffect 将检查计数是否更改。
  • @SujithSandeep rerender 是什么意思?如果调用第 67 行,我想它相当于rerender。没有rerender怎么会调用第67行
  • @SujithSandeep 您提到的情况可能是这种情况。是否有任何情况下功能组件功能在没有rerender 的情况下运行。如果确定的情况是可能的,一切都应该有意义

标签: reactjs react-hooks use-effect react-suspense react-18


【解决方案1】:

感谢 Sujith Sandeep 的提示。 我可以确认功能组件的调用和useEffect不是一对一的关系 至少我可以得出结论,功能组件中的值并不总是能够触发效果 然而,我仍然需要更多的资源来推理这种行为,我认为这种行为与并发模式有关,不确定它是一个反应错误还是如预期的那样

【讨论】:

    【解决方案2】:

    我的猜测是您将 App 组件包装在 React.StrictMode 中。以该模式包装的所有组件都将挂载、卸载然后再次挂载,本质上会触发useEffect 两次。

    我不是 React 开发人员,所以我不确定我们需要它的原因,但我认为需要确保您的组件正常运行,运行 useEffect 不应该破坏您的应用程序并且您的应用程序可以同时工作模式。

    const root = ReactDOM.createRoot(document.getElementById('root'))
    root.render(
      <React.StrictMode>
        <App />
      </React.StrictMode>
    )
    

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2022-06-10
      • 2020-06-03
      • 2021-04-09
      相关资源
      最近更新 更多