我的应用程序必须从 3 个不同的服务器获取数据,它们都连接到同一个数据库。因此,我将代码拆分为 3 个不同的 createAPI 并使用了不同的减速器路径,但是,如果我从 API A 进行编辑 PUT,但 API B 也需要刷新,则似乎我无法使用重新获取。
我无法更改服务器的布局,因为这是我们的后端服务器架构。
export const commonApi = createApi({
reducerPath: "commonApi",
baseQuery: commonBaseQuery, //URL: common.dev.example.com
endpoints: () => ({}), //later injected
tagTypes: ["SCHEME_LIST", "SCHEME_DETAIL"],
});
export const taskApi = createApi({
reducerPath: "taskApi",
baseQuery: taskBaseQuery, //URL: task.dev.example.com
endpoints: () => ({}), //later injected
tagTypes: ["LIST", "DETAIL"]
});
export const addressApi = createApi({...}) //omitted, same as above with different url
现在,如果我使用来自
editTask
的突变查询 taskAPI
。它需要从 getTaskList
更新 getTaskDetail
、taskAPI
。通过使用 invalidatesTags: ['LIST', 'DETAIL']
我可以自动获取更改。
但是,在此期间
editTask
,来自 getWarehouseList
的 API commonAPI
也需要更新以反映一些变化。我不能再使用标签,因为它们不属于同一个 createApi/reducerPath
问题是,当
getWarehouseList
中的 commonAPI
发生更改时,我该如何更新 editTask
中的 taskAPI
?或者唯一的方法是执行 unwrap().then() 并手动重新获取此数据?
谢谢!
您可以使用 invalidateTags API 切片实用程序来使您喜欢的任何特定标签无效。如何使用它是
commonApi
中的突变端点可以使taskApi
中的特定标签无效,反之亦然。我建议使用突变端点的 onQueryStarted 处理程序来执行此操作。
示例:
taskAPI 切片
...
editTask: build.mutation({
...
onQueryStarted: async(arg, { dispatch, queryFulfilled }) => {
try {
await queryFulfilled;
dispatch(commonAPI.util.invalidateTags(['LIST', 'DETAIL']));
} catch(error) {
// handle/ignore/etc
}
},
}),
...