Reactjs 在redux中选择整个切片是一种不好的做法吗?

Reactjs 在redux中选择整个切片是一种不好的做法吗?,reactjs,redux,react-redux,react-hooks,Reactjs,Redux,React Redux,React Hooks,我想在redux中选择一个完整的切片,如下所示: interface AuthState { user?: User; shouldShowLogin: boolean; } export const authSlice = createSlice({ name: 'auth', initialState, reducers: { setUser: ..., showLogin: ..., hideLogin: ..., }, }); expo

我想在redux中选择一个完整的切片,如下所示:

interface AuthState {
  user?: User;
  shouldShowLogin: boolean;
}

export const authSlice = createSlice({
  name: 'auth',
  initialState,
  reducers: {
    setUser: ...,
    showLogin: ...,
    hideLogin: ...,
  },
});

export const useAuth = () => useSelector((state) => state.auth);
所以我可以做一些类似于
const{user,shouldShowLogin}=useAuth()的事情在组件内。这在大多数情况下比较方便,但我不确定这是否是一种不良做法/效率低下

我想为dispatch做一些类似的事情(即抽象出useDispatch()。可能类似于
constsetuserwithdispatch=(info)=>usedpatch()(info)因此我可以在我的组件中简单地执行
setUserWithDispatch(userInfo)
,而不必执行
usedpatch()
然后执行
dispatch(setUser(userInfo))


理想情况下,我希望执行
const{user,shouldShowLogin,setUser,showLogin,hideLogin}=useAuth()当从
useSelector
中选择的值更改时,组件将重新启动。因此,您通常希望选择所需的最小信息量,以最大限度地减少重播

如果有多个属性处于
state.auth
状态,而您只关心其中一个属性,那么这种分解方法的缺点是,当对象的其他属性更改时,它将导致组件重新加载。在您的示例中,您似乎使用了所有属性,所以这不重要

我认为您将很难在不违反规则的情况下使用
dispatch
执行自定义操作。钩子不能有条件地调用,必须在组件的顶层调用。不能在事件处理程序回调内部、在
useffect
函数内部调用
useDispatch
(或使用它的自定义挂钩)

useDispatch
钩子的当前实现意味着您可以对每个组件调用一次
useDispatch
,以便根据react redux上下文访问当前存储的
dispatch
函数。返回的
dispatch
函数是一个纯函数(不是钩子),可以在任何地方使用


您可以使用redux将操作绑定到特定存储实例的分派。这听起来像是你想做的,但建议不要这样做。缺点是在操作和特定存储实例之间创建了不必要的耦合。您将无法使用其他存储实例进行测试。

当从
useSelector
中选择的值更改时,组件将重新启动。因此,您通常希望选择所需的最小信息量,以最大限度地减少重播

如果有多个属性处于
state.auth
状态,而您只关心其中一个属性,那么这种分解方法的缺点是,当对象的其他属性更改时,它将导致组件重新加载。在您的示例中,您似乎使用了所有属性,所以这不重要

我认为您将很难在不违反规则的情况下使用
dispatch
执行自定义操作。钩子不能有条件地调用,必须在组件的顶层调用。不能在事件处理程序回调内部、在
useffect
函数内部调用
useDispatch
(或使用它的自定义挂钩)

useDispatch
钩子的当前实现意味着您可以对每个组件调用一次
useDispatch
,以便根据react redux上下文访问当前存储的
dispatch
函数。返回的
dispatch
函数是一个纯函数(不是钩子),可以在任何地方使用

您可以使用redux将操作绑定到特定存储实例的分派。这听起来像是你想做的,但建议不要这样做。缺点是在操作和特定存储实例之间创建了不必要的耦合。您将无法使用其他存储实例进行测试