用泛型试着写了一下 useConfig 的类型,测试看起来没问题,还是想请老师看看

来源:11-7 抽象乐观更新通用hook

Ikozn

2021-10-18

  1. useConfig Hook
import { QueryKey, useQueryClient } from "react-query";

interface ConfigProps <T> {
  queryKey: QueryKey,
  callback: (target: Partial<T>, old?: T[]) => T[]
}

const useConfig = <T> ({queryKey, callback}: ConfigProps<T>) => {
  const queryClient = useQueryClient()
  return {
    onMutate: async (target: Partial<T>) => {
      await queryClient.cancelQueries(queryKey);
      // 保存前一次状态的快照
      const previousItems = queryClient.getQueryData(queryKey);
      // 乐观更新修改数据
      queryClient.setQueryData(
        queryKey,
        (old?: T[]) => callback(target, old)
      );
      // 返回前一次状态的快照,以便发生错误时需要回滚所使用
      return { previousItems };
    },
    // 出错时,使用前一次状态的快照重新设置当前缓存数据
    onError: (error: unknown, newItem: Partial<T>, context: unknown) => {
      queryClient.setQueryData(
        queryKey,
        (context as { previousItems: T[] }).previousItems
      );
    },
  }
}

export default useConfig
  1. useEditProject Hook
useMutation(
    (params: Partial<Project>) =>
      client(`/projects/${params.id}`, {
        method: "PATCH",
        data: params,
     }),
     useOptimisticOption<Project>({
	    queryKey,
	    callback: (target, old) => (old?.map(item => item.id === target.id ? { ...item, ...target } : item) || [])
	 }) 
);
写回答

1回答

我很容易上手

2022-04-12

你好同学,我不太懂 await queryClient.cancelQueries(queryKey); 这句的含义,为什么要先取消查询呢

0
1
chiakimi
Cancel any outgoing refetches (so they don't overwrite our optimistic update)
2022-11-13
共1条回复

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

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

2691 学习 · 1236 问题

查看课程