乐观更新在api请求结束之后,缓存值变成了之前的
来源:11-6 用 react-query 实现乐观更新

宝慕林6455129
2021-11-28
Hi 老师你好
我这边基本拷贝你的代码,做了一个简单的todolist的乐观更新。遇到了一个问题:
现象:点击添加按钮之后,成功更新。但在api请求结束之后,list的值又变成点按钮前的值(可以查看gif)。
依赖:react-query: 3.5.10 后端api使用的是json-server
想询问一下,这是什么原因导致的?
乐观更新的核心代码用的是:
export const useAddTodo = (queryKey: QueryKey) => {
return useMutation(
(params: Partial<Task>) =>
http(`tasks`, {
data: params,
method: "POST",
}),
useAddConfig(queryKey)
);
};
export const useAddConfig = (queryKey: QueryKey) =>
useConfig(queryKey, (target, old) => (old ? [...old, target] : []));
export const useConfig = (
queryKey: QueryKey,
callback: (target: any, old?: any[]) => any[]
) => {
const queryClient = useQueryClient();
return {
onSuccess: () => { queryClient.invalidateQueries(queryKey) },
async onMutate(target: any) {
console.log('call post api', queryKey)
const previousItems = queryClient.getQueryData(queryKey);
queryClient.setQueryData(queryKey, (old?: any[]) => {
return callback(target, old);
});
return { previousItems };
},
onError(error: any, newItem: any, context: any) {
console.log('error happen')
queryClient.setQueryData(queryKey, context.previousItems);
},
};
};
写回答
1回答
-
Nolan
2022-03-21
要检查api的返回值,有可能api的返回值和你了乐观更新的值不一样
00
相似问题