RTK 查询查询在突变后不重新获取

Jua*_*ruz 7 reactjs redux-toolkit rtk-query

在我的 api 上,我有两个突变,奇怪的是,其中一个确实触发了重新获取,但另一个没有,我不知道为什么。这两种突变都会进行网络调用,并且更改会反映在服务器中。

这是我的 api 定义。

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/dist/query/react";
import Sample from "core/types/Sample";
import getApiURL from "core/utils/getApiURL";

export const lithologyApi = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: getApiURL() }),
  tagTypes: ["Samples"],
  endpoints: build => ({
    addSample: build.mutation<Sample, Sample>({
      query: sample => ({
        url: `lithology/add-sample`,
        method: "POST",
        body: sample,
      }),
      invalidatesTags: ["Samples"],
    }),
    getSamples: build.query<Sample[], void>({
      query: () => "lithology/get-samples",
      providesTags: ["Samples"],
    }),
    deleteSample: build.mutation<void, number>({
      query: id => ({ url: `lithology/delete-sample/${id}`, method: "DELETE" }),
      invalidatesTags: ["Samples"],
    }),
  }),
});

export const {
  useAddSampleMutation,
  useGetSamplesQuery,
  useDeleteSampleMutation,
} = lithologyApi;
Run Code Online (Sandbox Code Playgroud)

我不知道它是否相关,但成功使 ( addSample) 无效的突变位于不同的组件中,而没有 ( deleteSample) 的突变位于同一个组件中(我已经尝试将其移动到另一个组件,但没有)无论如何都行不通)。

phr*_*hry 2

因此,只是在这里给出答案,以便其他人可以使用它:

我假设您的deleteSample端点给出了空响应。默认情况下,fetchBaseQuery'sresponseHandler设置为json,因此它尝试使用JSON.parse空字符串 - 并因未处理的错误而崩溃。

未捕获的语法错误:JSON.parse:JSON 数据第 1 行第 1 列处的数据意外结束

现在,invalidateTags仅在成功和已处理invalidateTags错误时调用,但在未处理错误的情况下不会调用,因为如果您不是数组而是函数,这会导致各种不可预测的行为。

长话短说:在您的请求中,设置responseHandlertext或自定义函数。

另外,始终阅读错误 - 当您从钩子中读取到上面的错误时,它应该已经变得非常明显了:)