在react-redux v7中,我们现在有了useDispatch()
钩子(Hook)来获取对商店调度的引用。看到这里:https://react-redux.js.org/api/hooks#usedispatch
然后需要将生成的dispatch
函数列为所有useEffect
,useMemo
等钩子(Hook)的依赖项。为什么是这样?
经过一些测试,该应用程序仍然可以完美运行,而没有将dispatch
列为依赖项,因此我只能假定它没有改变。
在任何情况下dispatch
函数都可能改变吗?
最佳答案
有两个答案。
首先,据我所知,React“钩子(Hook)规则” ESLint规则知道如何专门处理内置钩子(Hook)。例如,它知道useState()
总是返回相同的setter函数实例,因此您不必将其包含在useEffect()
依赖项数组中(通过dispatch
调用获取useReducer()
函数的同上)。
但是, Lint 规则不知道自定义钩子(Hook),无论它们来自库还是来自您自己的钩子(Hook)。因此,由于useDispatch()
是一个自定义钩子(Hook),因此lint规则必须假定dispatch
所发生的一切都可能发生变化,并尝试告诉您需要将其列为依赖项。
第二个答案是,可以将新的商店引用传递给<Provider>
,在这种情况下,从store.dispatch
Hook 返回了另一个useDispatch()
。
因此,实际上,在deps数组中不包含dispatch
的情况下,代码可以正常运行,因为您的应用程序几乎始终都在使用同一商店实例。但是,由于 Lint 规则不知道这一点,因此您可能仍需要将其包括在列表中以使其安静。
(来源:我是Redux维护者,并帮助指导了我们的hooks API的实现:))
关于javascript - 在什么情况下Redux dispatch 会发生变化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56795607/