如何在RTK Query中实现一个微服务执行变更操作后自动重新获取另一个微服务的数据?
如何在RTK Query中实现一个微服务执行变更操作后自动重新获取另一个微服务的数据?
嘿,这个需求其实正好可以用RTK Query自带的**标签失效(tag invalidation)**机制来解决,不用手动调用refetch,完全自动触发,而且代码改动很小。
看你的现有代码,Service B已经给getData接口加上了providesTags: ['Data'],这一步做得很对!现在只需要给Service A的postData mutation加上对应的标签失效配置就行,不过有个关键细节:因为这是两个独立的createApi实例,所以需要在Service A里也声明相同的tagTypes,这样RTK Query才能识别跨API的标签关联。
修改后的Service A代码:
// serviceA.ts (Microservice A) import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; export const serviceA = createApi({ reducerPath: 'serviceA', baseQuery: fetchBaseQuery({ baseUrl: '/api/serviceA' }), // 新增:声明和Service B一致的标签类型 tagTypes: ['Data'], endpoints: (builder) => ({ postData: builder.mutation<void, { message: string }>({ query: (body) => ({ url: '/data', method: 'POST', body, }), // 新增:指定要失效的标签,触发Service B的getData自动重新获取 invalidatesTags: ['Data'], }), }), }); export const { usePostDataMutation } = serviceA;
原理说明:
当你调用postData mutation并成功完成请求后,RTK Query会自动标记所有提供了['Data']标签的查询(也就是Service B里的getData)为失效状态,随后自动触发这些查询重新请求数据,你的UI会实时更新,完全不需要手动调用refetch。
扩展小提示:
如果你的业务场景更复杂(比如需要针对单条数据刷新而不是全局列表),还可以使用更精准的标签格式,比如:
- 在Service B的
getData里写providesTags: [{ type: 'Data', id: 'LIST' }] - 在Service A的
postData里写invalidatesTags: [{ type: 'Data', id: 'LIST' }]
这样就能只刷新列表数据,避免不必要的全局请求,不过你的当前场景用全局的['Data']标签就完全够用啦。
现在你再测试一下,调用usePostDataMutation提交数据后,Service B的列表会自动更新,不用手动刷新页面咯!
备注:内容来源于stack exchange,提问作者Saleh Salem
相关产品推荐
相关产品推荐

