【问题标题】:What are the cases where Redux dispatch could change?Redux 调度可能会改变的情况有哪些?
【发布时间】:2019-06-27 16:53:02
【问题描述】:
在 react-redux v7 中,我们现在有 useDispatch() 挂钩来获取对存储调度的引用。见这里:https://react-redux.js.org/api/hooks#usedispatch
然后需要将生成的 dispatch 函数列为任何 useEffect、useMemo 等挂钩的依赖项。这是为什么呢?
经过一些测试,应用程序仍然可以正常运行,而 dispatch 没有被列为依赖项,所以我只能假设它没有改变。
dispatch 函数是否有可能发生变化?
【问题讨论】:
标签:
javascript
reactjs
redux
react-redux
【解决方案1】:
对此有两个答案。
首先,据我所知,React “钩子规则” ESLint 规则知道如何专门处理内置的钩子。例如,它知道useState() 总是返回相同的setter 函数实例,因此您不必将它包含在useEffect() 依赖数组中(来自useReducer() 调用的dispatch 函数也是如此)。
但是,lint 规则不了解自定义挂钩,无论它们来自库还是您自己的。所以,由于useDispatch() 是一个自定义钩子,lint 规则必须假定无论dispatch 的东西是什么可能 改变,并试图告诉你你需要将它列为依赖项。
第二个答案是可以将新的商店引用传递给<Provider>,在这种情况下,useDispatch() 挂钩会返回不同的store.dispatch。
因此,实际上,在 deps 数组中不包含 dispatch 的情况下,代码将运行良好,因为您的应用几乎可以肯定地始终使用同一个商店实例。但是,由于 lint 规则不知道这一点,您可能需要将其包含在列表中以使其安静。
(来源:我是一名 Redux 维护者,并帮助指导了我们的 hooks API 的实现:))