@Andrey1302

RTK Query. Как изменить теги, чтобы после выполнения мутации инвалидировалась только нужная query, а не все?

Есть 2 квери и одна мутация.
Сейчас происходит так, что при выполнении мутации инвалидируются обе квери, а нужно инвалидировать только ту, у которой есть все три тега:
{ type: TagTypes.VendorInvoiceReview, vendor: params.vendor_id, facility: params.facility_id },

то есть getInvoiceReviewTaskDetails

Не пойму как это реализовать? По факту можно использовать 2 разных тега для двух квери, но подход так себе

const vendorInvoiceReviewApi = api.injectEndpoints({
  endpoints: (build) => ({
    getInvoiceReviewsTasks: build.query<ResponseWithTotal<InvoiceReviewTask>, ServerSideRequestParams>({
      transformResponse: transformResponseWithTotal,
      query: (params) => ({
        method: 'GET',
        url: '/api/invoice-reviews/tasks' + generateQueryParams(params),
      }),
      providesTags: [{ type: TagTypes.VendorInvoiceReview, id: 'LIST' }]
    }),
    getInvoiceReviewTaskDetails: build.query<InvoiceReviewTaskDetails, number>({
      transformResponse,
      query: (id) => ({
        method: 'GET',
        url: `/api/invoice-reviews/tasks/${id}`
      }),
      providesTags: (response) =>
        response ?
          [{ type: TagTypes.VendorInvoiceReview, id: response.id, vendor: response.vendor.id, facility: response.facility.id }] : []
    }),
    updateInvoiceReviewTask: build.mutation<void, UpdateFacilityInvoiceReviewTaskRequest>({
      query: ({ facility_id, vendor_id, ...body }) => ({
        url: `/api/invoice-reviews/vendor/${vendor_id}/facility/${facility_id}`,
        method: "PUT",
        body
      }),
      transformResponse,
      invalidatesTags: (response, error, params) =>
        [{ type: TagTypes.VendorInvoiceReview, vendor: params.vendor_id, facility: params.facility_id }]
    })
  }),
  overrideExisting: false
})


По факту можно заменить
{ type: TagTypes.VendorInvoiceReview, id: response.id, vendor: response.vendor.id, facility: response.facility.id }

на
{ type: TagTypes.VendorInvoiceReview, id: response.id }


и в мутации инвалидировать именно этот тег с типом и айди, но

1. Я не хочу прокидывать айди в мутацию, так как оно там не нужно
2. Хотелось бы инвалидировать все таски с конкретным вендором и фасилити, а не только одну по айди
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
У объекта тега могуть быть только type и id:
An individual tag has a type, represented as a string name, and an optional id, represented as a string or number. It can be represented as a plain string (such as 'Post'), or an object in the shape {type: string, id?: string|number} (such as [{type: 'Post', id: 1}]).
https://redux-toolkit.js.org/rtk-query/usage/autom...

Так что вашу структуру нужно разделить на несколько тегов:
getInvoiceReviewTaskDetails: build.query<InvoiceReviewTaskDetails, number>({
  ...
  providesTags: (response) =>
    response ?
      [
        { type: TagTypes.VendorInvoiceReview, id: response.id },
        { type: TagTypes.VendorInvoiceReview, id: `vendor-${response.vendor.id}` },
        { type: TagTypes.VendorInvoiceReview, id: `facility-${response.facility.id}` },
      ] : []
}),

updateInvoiceReviewTask: build.mutation<void, UpdateFacilityInvoiceReviewTaskRequest>({
  ...
  invalidatesTags: (response, error, params) =>
    [
      { type: TagTypes.VendorInvoiceReview, id: `vendor-${params.vendor_id}` },
      { type: TagTypes.VendorInvoiceReview, id: `facility-${params.facility_id}` },
    ]
})


Но можно обойтись и одним:
getInvoiceReviewTaskDetails: build.query<InvoiceReviewTaskDetails, number>({
  ...
  providesTags: (response) =>
    response ?
      [{ type: TagTypes.VendorInvoiceReview, id: `vendor-${response.vendor.id},facility-${response.facility.id}` }] : []
}),

updateInvoiceReviewTask: build.mutation<void, UpdateFacilityInvoiceReviewTaskRequest>({
  ...
  invalidatesTags: (response, error, params) =>
    [{ type: TagTypes.VendorInvoiceReview, id: `vendor-${params.vendor_id},facility-${params.facility_id}` }]
})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы