rootStore.dispatch 放在全局变量上和 useDispath 的区别

自己经常的做法是直接把 rootStore.dispatch 放在全局变量上,方便触发

在Redux或Redux Toolkit(RTK)的应用中,将rootStore.dispatch直接放在全局变量上和使用useDispatch hook得到的dispatch函数在功能上是等价的,它们都可以用来派发(dispatch)action以触发状态更新。然而,它们在使用场景、最佳实践和React组件内的可用性方面存在一些关键区别。

1. 使用场景

  • 全局变量:将rootStore.dispatch(或仅仅是store.dispatch,如果你没有使用RTK的configureStore创建的rootStore)放在一个全局变量上,意味着你可以在任何地方(包括非React组件)访问和派发action。然而,这种做法通常不推荐,因为它违反了React的组件化原则和封装性,同时也使得测试和维护变得更加困难。

  • useDispatch HookuseDispatch是React Redux库提供的一个Hook,它只能在React函数组件或自定义Hook内部使用。它提供了一种在React组件中访问Redux dispatch函数的方式,使得组件能够直接派发action来更新状态。这种方式更加符合React的组件化设计原则,也更容易在组件内部进行状态管理。

2. 封装性和可测试性

  • 全局变量:使用全局变量来访问dispatch函数会破坏代码的封装性,使得任何地方的代码都可以修改Redux store的状态,这可能会导致状态管理变得混乱和难以追踪。此外,这也使得代码更难以测试,因为你需要模拟全局状态的变化。

  • useDispatch Hook:通过useDispatch在组件内部访问dispatch函数,你可以更容易地将Redux逻辑封装在组件内部,提高代码的模块化和可重用性。同时,这也使得组件更容易进行单元测试,因为你可以通过模拟dispatch函数来测试组件的行为。

3. React组件内的可用性

  • 全局变量:虽然全局变量可以在任何地方访问,但在React组件内部直接使用它可能会导致React的渲染机制出现问题,因为React依赖于组件的props和state来决定何时重新渲染组件。如果组件的渲染不依赖于Redux store的状态,但你却通过全局变量来修改这个状态,那么React可能无法正确地追踪到这种变化并触发必要的渲染。

  • useDispatch HookuseDispatch是专门为React组件设计的,它确保了当组件通过dispatch函数派发action时,React能够正确地追踪到这种变化并触发必要的渲染。

结论

虽然从技术上讲,将rootStore.dispatch放在全局变量上和使用useDispatch得到的dispatch函数在功能上是等价的,但推荐使用useDispatch Hook来在React组件内部访问和派发Redux action。这样做更符合React的组件化设计原则,也更容易进行代码封装、维护和测试。