Как можно реализовать инвалидацию обеих квери мутации, когда это необходимо делать только для одной, используя три определенных тега?
Для указания тегов в RTK Query можно использовать опцию **`invalidatesTags`** в конфигурации мутации. Например, чтобы инвалидировать только определенную квери после выполнения мутации, можно указать тег этой квери в массиве опции **`invalidatesTags`**: ```js import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/api' }), endpoints: (builder) => ({ fetchData: builder.query({ query: (data) => `/data/${data}`, }), updateData: builder.mutation({ query: (data) => ({ url: '/data/update', method: 'POST', body: data, }), invalidatesTags: ['fetchData'], // Инвалидация только тега fetchData }), }), }); ``` Чтобы инвалидировать обе квери после выполнения мутации только в случае необходимости, можно указать несколько тегов в массиве опции **`invalidatesTags`** для мутации: ```js import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/api' }), endpoints: (builder) => ({ fetchData1: builder.query({ query: (data) => `/data1/${data}`, }), fetchData2: builder.query({ query: (data) => `/data2/${data}`, }), updateData: builder.mutation({ query: (data) => ({ url: '/data/update', method: 'POST', body: data, }), invalidatesTags: ['fetchData1', 'fetchData2'], // Инвалидация обоих тегов при выполнении мутации }), }), }); ``` Таким образом, можно легко указывать теги, которые нужно инвалидировать после выполнения мутации в RTK Query, чтобы управлять поведением кэширования данных.
У объекта тега могуть быть только 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 ashttps://redux-toolkit.js.org/rtk-query/usage/autom...'Post'
), or an object in the shape{type: string, id?: string|number}
(such as[{type: 'Post', id: 1}]
).
Так что вашу структуру нужно разделить на несколько тегов:
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}` }] })