乐观更新在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的返回值和你了乐观更新的值不一样

0
0

React17+Hook+TS4 优质实践,仿 Jira 企业级项目

解锁 React17 高阶用法,轻松应对大型复杂长周期项目

2691 学习 · 1236 问题

查看课程