所以我有两个Zustand存储,一个存储配置信息,比如当前在模态中查看的是哪个用户:
export const useConfigStore = create<ConfigStoreState>((set) => ({
selectedUser: undefined,
setSelectedUser: (user: User) => {
set(
produce((draft) => {
draft.selectedUser = user;
})
);
}
}));
..,另一个存储其它应用数据:
export const usePermissionsStore = create<PermissionsStoreState>((set) => ({
userPermissions: [],
createDefaultPermissions: (users: Array<Users>) => {
set(
produce((draft) => {
draft.userPermissions = users.map(x => new UserPermission(x))
});
)
},
getPermissionsForCurrentUser: () => {
const selectedUser = useConfigStore.getState().selectedUser;
return get().userPermissions.find(x => x.user.id === selectedUser.id);
}
}));
在React组件中,我调用了一个API,它获取用户并填充userPermissions
,然后自动选择列表中的第一个用户。
问题是,无论何时userPermissions
得到更新,getPermissionsForCurrentUser()
函数都不会重新触发或导致重新呈现。
const MyPage = () => {
const { users, isLoading } = useFetchUsers();
const setSelectedUser = useConfigStore((state) => state.setSelectedUser);
// This selector isn't firing when `useConfigStore.selectedUser` updates
const permissionsForSelectedUser = usePermissionsStore((state) => state.getPermissionsForCurrentUser());
React.useEffect(() => {
if(users.length > 0) {
setSelectedUser(users[0]);
}
}, [users]);
React.useEffect(() => {
// This useEffect triggers only once
console.log("permissionsForSelectedUser updated...")
}, [permissionsForSelectedUser]);
return (
<>
{isLoading || !users || !permissionsForSelectedUser ? (
<div>Loading...</div>
) : (
<div>Permissions are available!: {permissionsForSelectedUser.xyz}</div>
)}
</>
);
};
所以getPermissionsForCurrentUser()
显然依赖于另一个存储中的selectedUser
,但是当它改变时它不更新,我看不到一种方法来指定它应该更新。
问题是他们被分成了两个不同的商店吗?我该怎么解决这个问题?
1条答案
按热度按时间5us2dqdw1#
是否有一个很强的理由需要有两个存储?如果没有,通常当我使用Zustand时,我通常会使用切片在一个存储中分解我的状态。
以下链接演示了如何进行设置:
可以有一个小的设置,以获得正是你想要的。
但如果我试图将您的逻辑重写到一个存储中,它可能看起来像这样:
然后在
Page.tsx
中使用它