代码之家  ›  专栏  ›  技术社区  ›  itan mare

rtk查询合并数据,标签,突变

  •  1
  • itan mare  · 技术社区  · 1 年前

    我有两个端点,它们由tagTypes链接,

    第一个端点是一个get查询,每次我点击show more按钮时,都会重新绘制当前数据并将其与新数据合并,

    第二个端点是添加新用户的突变

    export const usersApi = createApi({
      reducerPath: "userApi",
      baseQuery: fetchBaseQuery({ baseUrl: "url" }),
      tagTypes: ['User'],
      endpoints: (builder) => ({
        getUsers: builder.query({
            query: ({page}) => `users?page=${page}&count=6`,
            serializeQueryArgs: ({ endpointName }) => {
                return endpointName
              },
            merge: (currentCache, newItems, {arg}) => {
                currentCache?.users?.push(...newItems?.users)
            },
            forceRefetch({ currentArg, previousArg }) {
                return currentArg !== previousArg
            },
            providesTags: ['User']
            }),
        createNewUser: builder.mutation({
          query: ({token, formData}) => ({
            url: `users`,
            method: 'POST',
            headers: {
              'Token': token,
            },
            body: formData,
          }),
          invalidatesTags: ['User'],
        })
        }) 
    })
    

    问题是,当我添加新用户时,第一个端点正在重新蚀刻和合并当前和新数据,我不需要它,如何在第一个端点的evry突变后清除当前缓存?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Drew Reese    1 年前

    您可以添加 onQueryStarted 的处理程序 createNewUser 调度操作以更新的缓存的端点 getUsers 端点。这与申请基本相同 Optimistic Updates .

    基本示例:

    export const usersApi = createApi({
      reducerPath: "userApi",
      baseQuery: fetchBaseQuery({ baseUrl: "url" }),
      tagTypes: ['User'],
      endpoints: (builder) => ({
        getUsers: builder.query({
          query: ({ page }) => `users?page=${page}&count=6`,
          serializeQueryArgs: ({ endpointName }) => {
            return endpointName
          },
          merge: (currentCache, newItems, { arg }) => {
            currentCache?.users?.push(...newItems?.users)
          },
          forceRefetch({ currentArg, previousArg }) {
            return currentArg !== previousArg
          },
          providesTags: ['User']
        }),
        createNewUser: builder.mutation({
          query: ({ token, formData }) => ({
            url: `users`,
            method: 'POST',
            headers: {
              'Token': token,
            },
            body: formData,
          }),
          invalidatesTags: ['User'],
          onQueryStarted: async (arg, { dispatch, queryFulfilled }) => {
            // Dispatch API utility to update the getUsers endpoint cache
            const patchResult = dispatch(usersApi.util.updateQueryData(
              "getUsers",
              undefined,
              draft => {
                // check this access, I'm just guessing based on information
                // provided above in getUsers cache merging
                draft.users = [];
              }
            ));
        
            try {
              await queryFulfilled;
            } catch {
              // Undo if there were any mutation errors
              patchResult.undo();
            }
          },
        }),
      }),
    });