【问题标题】:React UseEffect function triggering in empty array change在空数组更改中触发 React UseEffect 函数
【发布时间】:2020-12-23 09:50:03
【问题描述】:

如果 prop 值从一个空数组更改为另一个空数组,我正在开发的 react 应用程序会触发 userEffect 函数。

我从页面获取查询参数并将它们传递到一个组件中,如果任何查询参数数组发生更改,该组件将重新呈现。但问题是useEffect 函数会触发并重新渲染组件,即使查询参数数组从[] 更改为[]

我知道[] !== [],也许这就是导致问题的原因。但是有没有办法让应用程序一开始就阻止触发 useEffect 函数?

这是一个代码沙盒演示:https://codesandbox.io/s/vibrant-greider-qgjgs?file=/src/App.js

【问题讨论】:

  • 目前还不清楚您到底要做什么。您究竟希望useEffect 何时运行?
  • @jered ,只是不想在 prop 从 [] 更改为 [] 时触发它
  • 为什么不在 useEffect 中使用 if-else?它仍然会触发函数,但函数仍然可以决定要做什么
  • @MuhammedB.Aydemir,也许我可以使用 if 语句来检查长度。如果查询参数从 ['some-data'] to []` 更改会发生什么。你是怎么处理的?
  • 如果组件针对这种边缘情况重新渲染,是否会出现问题(性能)?有什么顾虑?

标签: javascript arrays reactjs react-router next.js


【解决方案1】:

您正在为测试分配一个新引用,因此它正在触发更新。

您应该重新分配相同的数组并对其进行操作。

   const handleClick = () => {
   const arr = test
    setTest(arr);
  };

【讨论】:

  • 这可能适用于这种特定情况。但是如果数组来自查询参数我该怎么办?
  • 它也应该在那里工作。由于查询参数将更改您的数组。它将由 useEffect 处理。而在 useEffect 中,它会在获得新数据时自动触发。
  • 我的意思是数组直接来自查询参数。我没有对那个数组做任何事情,只是检查数组是否不同
  • 您能否提供您的方法示例,我可以提供帮助。
【解决方案2】:

您可以创建自己的自定义钩子来检查每个依赖项数组项的深度相等性,也可以使用类似use-deep-compare-effect的钩子

【讨论】:

    【解决方案3】:

    除了上面的答案,you can also use React.memo as a way to do a comparison check between previous props and new props。如果你的 props 有点复杂,你也可以在上面添加 Lodash。

    【讨论】:

    • 你说的是<Test />的道具吗?您没有在该组件上传递任何内容,但这对您遇到的问题来说并不是什么大问题。您的 setTest 将重新呈现 App 组件,该组件随后会重新呈现其子组件。
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 2021-03-29
    • 2021-10-25
    • 1970-01-01
    • 2021-12-05
    • 2022-06-14
    • 2021-09-10
    • 2020-09-07
    相关资源
    最近更新 更多