Redux Toolkit Query如何基于mutation响应直接更新状态避免重查
实现方案
你可以通过 RTK Query 提供的缓存更新工具 updateQueryData 直接修改 getPosts 的缓存数据,完全避免额外的 GET 请求,总共需要两处调整:
1. 调整 getPosts 的标签配置(可选但推荐)
为了后续可以单独针对单条帖子做缓存操作,先给每条返回的帖子分配独立标签:
getPosts: builder.query<Form[], void>({ // 无请求参数的话第二个泛型改为void更合适 query: () => `/posts`, providesTags: (result) => result ? [ ...result.map(post => ({ type: TAG_TYPE, id: post.id })), { type: TAG_TYPE, id: 'LIST' }, ] : [{ type: TAG_TYPE, id: 'LIST' }], }),
2. 修改 updatePost 逻辑,用返回值更新缓存
删除原来的 invalidatesTags 配置,换成 onQueryStarted 钩子,等 mutation 成功后直接更新列表缓存:
updatePost: builder.mutation<Form, { formId: string; formData: any }>({ // 第一个泛型改为你返回的帖子类型更规范 query: (data) => ({ url: `/posts/${data.formId}`, // 注意和你定义的接口路径保持一致,原代码写的/post/可能会404 method: 'PATCH', body: data.formData, }), async onQueryStarted(args, { dispatch, queryFulfilled }) { try { // 等待mutation请求成功,拿到返回的更新后数据 const { data: updatedPost } = await queryFulfilled // 直接更新getPosts接口的缓存 dispatch( postsApi.util.updateQueryData( 'getPosts', undefined, // 如果你调用getPosts时有传参,这里填对应的参数值 (draftPosts) => { // 找到对应id的帖子,替换成更新后的数据 const targetIndex = draftPosts.findIndex(post => post.id === args.formId) if (targetIndex !== -1) { draftPosts[targetIndex] = updatedPost } } ) ) } catch (err) { // 请求失败时可在此处添加错误提示逻辑 } } }),
补充说明
- 这里基于 Immer 处理不可变数据,你可以直接修改
draftPosts里的内容,不需要手动返回新数组 - 如果你还实现了单条帖子查询的接口
getPostById,可以在上述逻辑里同时更新单条缓存,避免其他用到单条数据的组件显示旧内容
内容的提问来源于stack exchange,提问作者NSjonas
相关产品推荐
相关产品推荐

