Reactjs 在redux中选择整个切片是一种不好的做法吗?
我想在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
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()但是我不知道该怎么做。再说一次,这种做法是否不好/效率低下?为什么redux不自动配置此选项?当从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将操作绑定到特定存储实例的分派。这听起来像是你想做的,但建议不要这样做。缺点是在操作和特定存储实例之间创建了不必要的耦合。您将无法使用其他存储实例进行测试