You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过deleteEmployee Mutation标签失效触发getEmployees自动重取?

解决方案

RTK Query的标签失效自动重取机制只对query端点生效,你现在把获取员工数据的逻辑放在了mutation里,所以deleteEmployee失效标签后不会自动触发它重新执行。下面给两种可行的解决办法:

方案一:将getEmployees改为query端点(推荐)

虽然后端要求用POST请求获取数据,但RTK Query的query端点支持自定义请求方法,完全可以满足需求。改成query后就能自动利用标签失效的重取机制:

import { createApi } from '@reduxjs/toolkit/query/react'
import customFetchBase from './customFetchBase.js'

export const publicApi = createApi({
  reducerPath: 'publicApi',
  baseQuery: customFetchBase,
  tagTypes: ['employees'],
  endpoints: builder => ({
    // 把mutation改成query
    getEmployees: builder.query({
      query: ({
        formData = "defaultHashedDataString",
        salt = "xyz",
        pageIndex = 1
      }) => ({
        url: '/Hafez/Employee/Data',
        method: 'POST', // 依然使用POST方法
        body: {
          RequestVerificationToken: salt,
          FormData: formData,
          currentPage: pageIndex + 1
        }
      }),
      providesTags: ['employees']
    }),
    deleteEmployee: builder.mutation({
      query: ({ formData, salt }) => ({
        url: '/Hafez/Employee/Delete',
        method: 'POST',
        body: { RequestVerificationToken: salt, FormData: formData }
      }),
      invalidatesTags: ['employees'] // 失效标签后,getEmployees会自动重取
    })
  })
})

// 注意导出的hook变成useGetEmployeesQuery
export const { useGetEmployeesQuery, useDeleteEmployeeMutation } = publicApi

使用时替换原来的useGetEmployeesMutation为useGetEmployeesQuery即可,它会自动管理数据的获取、缓存和重取逻辑。

方案二:手动触发getEmployees执行(仅当无法改成query时使用)

如果必须保留getEmployees为mutation端点,可以在deleteEmployee的onQueryStarted回调里手动触发它的执行:

import { createApi } from '@reduxjs/toolkit/query/react'
import customFetchBase from './customFetchBase.js'

export const publicApi = createApi({
  reducerPath: 'publicApi',
  baseQuery: customFetchBase,
  tagTypes: ['employees'],
  endpoints: builder => ({
    getEmployees: builder.mutation({
      query: ({
        formData = "defaultHashedDataString",
        salt = "xyz",
        pageIndex = 1
      }) => ({
        url: '/Hafez/Employee/Data',
        method: 'POST',
        body: {
          RequestVerificationToken: salt,
          FormData: formData,
          currentPage: pageIndex + 1
        }
      }),
      providesTags: ['employees']
    }),
    deleteEmployee: builder.mutation({
      query: ({ formData, salt }) => ({
        url: '/Hafez/Employee/Delete',
        method: 'POST',
        body: { RequestVerificationToken: salt, FormData: formData }
      }),
      invalidatesTags: ['employees'],
      async onQueryStarted(args, { dispatch, queryFulfilled }) {
        try {
          await queryFulfilled;
          // 传入getEmployees需要的参数,根据实际业务场景调整
          dispatch(publicApi.endpoints.getEmployees.initiate({
            formData: "defaultHashedDataString",
            salt: "xyz",
            pageIndex: 1
          }));
        } catch (err) {
          // 可在此处理删除失败的逻辑
        }
      }
    })
  })
})

export const { useGetEmployeesMutation, useDeleteEmployeeMutation } = publicApi

这种方法需要手动维护getEmployees的参数,不如方案一简洁,因此优先推荐方案一。

内容的提问来源于stack exchange,提问作者Alireza Kordkheili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:33:14