src/hooks/useOptimisticTasks.ts
需要关注
+58 −0
@@ -0,0 +1,58 @@
1+import { useMutation, useQueryClient } from '@tanstack/react-query';
2+import { updateTask, TaskPatch } from '../api/tasks';
3+import type { Task } from '../types/task';
4+
5+export function useOptimisticTasks(boardId: string) {
6+ const qc = useQueryClient();
7+ const key = ['tasks', boardId];
8+
9+ return useMutation({
10+ mutationFn: (patch: TaskPatch) => updateTask(patch),
11+ onMutate: async (patch) => {
12+ const prev = qc.getQueryData<Task[]>(key);
13+ qc.setQueryData<Task[]>(key, (old = []) =>
14+ old.map(t => t.id === patch.id ? { ...t, ...patch } : t)
15+ );
16+ return { prev };
17+ },
18+ onError: (_e, _p, ctx) => qc.setQueryData(key, ctx?.prev),
19+ });
20+}
阻塞
onMutate没有先调用qc.cancelQueries(key)。如果在乐观写入和服务端响应之间正好插入一次后台 refetch,就会把乐观状态盖掉,UI 会闪回到旧值。小建议回滚把列表还原了,但没有把错误显式抛出来。建议在这里接入现有的
pushToast,让用户知道这次切换没生效。