回滚到以前的状态在反应查询中不起作用(乐观更新)
Rollback to previous state is not working in react query (optimistic updates)
我正在使用乐观更新反应查询,在这里我增加了关注者并更新了以下状态,下面是我的代码:
一切正常,但是当错误出现时,previousSnapshot 和 previousUserData 没有保存以前的值,它一次又一次地 returning 错误块中的变异或更新数据,它是应该 return 以前的状态但不是,请让我知道我在这里做错了什么。
const callFavoriteUserMutation = useMutation(favoriteUser, {
onMutate: async _id => {
const previousSnapshot = queryClient.getQueryData(`${id}userdetail`);
const previousUserData = queryClient.getQueryData('getUserInfo');
queryClient.setQueryData(`${id}userdetail`, (oldData: any) => {
const updatedData = {...oldData};
updatedData.stats.followers += 1;
updatedData.following = true;
return updatedData;
});
queryClient.setQueryData('getUserInfo', (oldUserData: any) => {
const updatedData = {...oldUserData};
updatedData.stats.following += 1;
return updatedData;
});
return {previousSnapshot, previousUserData};
},
onError: (error_code, _id, context: any) => {
queryClient.setQueryData(`${id}userdetail`, context.previousSnapshot);
queryClient.setQueryData('getUserInfo', context.previousUserData);
setFollowing(context.previousSnapshot.following);
setNoOfFollowers(context.previousSnapshot.stats?.followers);
setNoOfFollowing(context.previousSnapshot?.stats?.following);
},
});
这是因为你正在改变原始数据。您只创建一个浅拷贝:
const updatedData = {...oldData};
然后改变深层属性:
updatedData.stats.followers += 1;
updatedData.following = true;
请不可变地更新,或者创建一个深层副本,或者如果您更喜欢可变语法,请使用类似 immer 的东西。
我正在使用乐观更新反应查询,在这里我增加了关注者并更新了以下状态,下面是我的代码:
一切正常,但是当错误出现时,previousSnapshot 和 previousUserData 没有保存以前的值,它一次又一次地 returning 错误块中的变异或更新数据,它是应该 return 以前的状态但不是,请让我知道我在这里做错了什么。
const callFavoriteUserMutation = useMutation(favoriteUser, {
onMutate: async _id => {
const previousSnapshot = queryClient.getQueryData(`${id}userdetail`);
const previousUserData = queryClient.getQueryData('getUserInfo');
queryClient.setQueryData(`${id}userdetail`, (oldData: any) => {
const updatedData = {...oldData};
updatedData.stats.followers += 1;
updatedData.following = true;
return updatedData;
});
queryClient.setQueryData('getUserInfo', (oldUserData: any) => {
const updatedData = {...oldUserData};
updatedData.stats.following += 1;
return updatedData;
});
return {previousSnapshot, previousUserData};
},
onError: (error_code, _id, context: any) => {
queryClient.setQueryData(`${id}userdetail`, context.previousSnapshot);
queryClient.setQueryData('getUserInfo', context.previousUserData);
setFollowing(context.previousSnapshot.following);
setNoOfFollowers(context.previousSnapshot.stats?.followers);
setNoOfFollowing(context.previousSnapshot?.stats?.following);
},
});
这是因为你正在改变原始数据。您只创建一个浅拷贝:
const updatedData = {...oldData};
然后改变深层属性:
updatedData.stats.followers += 1;
updatedData.following = true;
请不可变地更新,或者创建一个深层副本,或者如果您更喜欢可变语法,请使用类似 immer 的东西。