来自修改的失效处理
使查询失效只是问题的一半;知道何时使其失效则是另一半。通常,当应用中的某个修改成功执行后,你的应用中极有可能存在若干相关查询需要被使失效,甚至可能需要重新拉取,以反映该修改带来的新变更。
例如,假设我们有一个用于发布新待办事项的修改:
TypeScript
1const mutation = useMutation({ mutationFn: postTodo })当成功的 postTodo 修改发生时,我们很可能希望所有 todos 查询都被使失效,并可能被重新拉取,从而展示新的待办事项。为此,你可以使用 useMutation 的 onSuccess 选项以及 client 的 invalidateQueries 函数:
TypeScript
1import { useMutation, useQueryClient } from '@tanstack/preact-query'2 3const queryClient = useQueryClient()4 5// When this mutation succeeds, invalidate any queries with the `todos` or `reminders` query key6const mutation = useMutation({7 mutationFn: addTodo,8 onSuccess: async () => {9 // If you're invalidating a single query10 await queryClient.invalidateQueries({ queryKey: ['todos'] })11 12 // If you're invalidating multiple queries13 await Promise.all([14 queryClient.invalidateQueries({ queryKey: ['todos'] }),15 queryClient.invalidateQueries({ queryKey: ['reminders'] }),16 ])17 },18})在 onSuccess 中返回一个 Promise,可确保数据更新完成之后,修改才被视为完全结束(即:isPending 为 true 的状态会持续到 onSuccess 被兑现为止)。
你可以通过 useMutation Hook 提供的任意回调函数来触发失效处理逻辑。
延伸阅读
若想了解如何在修改后自动使查询失效,请参阅 TkDodo 关于修改后自动查询失效的文章。