Redux Toolkit 查询:从“突变”响应中减少状态

Posted

技术标签:

【中文标题】Redux Toolkit 查询:从“突变”响应中减少状态【英文标题】:Redux Toolkit Query: Reduce state from "mutation" response 【发布时间】:2021-11-14 12:16:12 【问题描述】:

假设我有一个 RESTish API 来管理“帖子”。

GET /posts 返回所有帖子 PATCH /posts:id 更新帖子并回复新记录数据

我可以通过这样的方式使用 RTK 查询来实现这一点:

const TAG_TYPE = 'POST';

// Define a service using a base URL and expected endpoints
export const postsApi = createApi(
  reducerPath: 'postsApi',
  tagTypes: [TAG_TYPE],
  baseQuery,
  endpoints: (builder) => (
    getPosts: builder.query<Form[], string>(
      query: () => `/posts`,
      providesTags: (result) =>
        [
           type: TAG_TYPE, id: 'LIST' ,
        ],
    ),
    updatePost: builder.mutation<any,  formId: string; formData: any >(
      // note: an optional `queryFn` may be used in place of `query`
      query: (data) => (
        url: `/post/$data.formId`,
        method: 'PATCH',
        body: data.formData,
      ),
      // this causes a full re-query.  
      // Would be more efficient to update state based on resp.body
      invalidatesTags: [ type: TAG_TYPE, id: 'LIST' ],
    ),
  ),
);

updatePost 运行时,它会使LIST 标记无效,从而导致getPosts 再次运行。

但是,由于 PATCH 操作本身会使用新数据进行响应,因此我希望避免发出额外的服务器请求,而只需使用 response.body 的内容更新该特定记录的减速器状态。

似乎是一个常见的用例,但我很难找到任何有关执行此类操作的文档。

【问题讨论】:

【参考方案1】:

您可以稍后应用optimistic updates 中描述的机制:

import  createApi, fetchBaseQuery  from '@reduxjs/toolkit/query'
import  Post  from './types'

const api = createApi(
  // ...
  endpoints: (build) => (
    // ...
    updatePost: build.mutation<void, Pick<Post, 'id'> & Partial<Post>>(
      query: ( id, ...patch ) => (
        // ...
      ),
      async onQueryStarted( id, ...patch ,  dispatch, queryFulfilled ) 
        const  data  = await queryFulfilled
        dispatch(
          api.util.updateQueryData('getPost', id, (draft) => 
            Object.assign(draft, data)
          )
        )
      ,
    ),
  ),
)

【讨论】:

嗯,有道理。我认为onQueryStarted 让我失去了气味。谢谢!

以上是关于Redux Toolkit 查询:从“突变”响应中减少状态的主要内容,如果未能解决你的问题,请参考以下文章

将项目添加到 redux-toolkit 中的嵌套数组

Redux-Toolkit = 无法使用 useSelector 显示 API 响应数据

Redux-Toolkit 查询拦截器

Redux Toolkit RTK Query 发送查询参数

从 Redux-Toolkit 存储中获取返回 undefined

Redux-Toolkit 和 React Hooks - 存储更改不会触发重新渲染