如何在RTK Query中实现任务增删时自动重获取getBoardById接口
解决添加/删除任务后自动刷新单个Board数据的问题
要实现添加或删除任务后自动重新获取getBoardById接口,需要利用RTK Query的标签失效机制,通过更细粒度的标签控制精准刷新目标查询,而非全局刷新所有Board相关数据。以下是具体修改方案:
1. 优化Board API切片的标签配置
修改boardApi,将标签从全局的'Boards'改为带ID的细粒度标签,精准定位单个Board的查询:
export const apiBoardSlice = createApi({ reducerPath: 'apiBoardSlice', baseQuery: fetchBaseQuery({ baseUrl: API_URL, prepareHeaders: headers => headers.set('Authorization', `Bearer ${token}`) }), tagTypes: ['Boards'], endpoints: (builder) => ({ getBoards: builder.query({ query: () => 'board', providesTags: ['Boards'], }), getBoardById: builder.query({ query: (id) => `board/${id}`, // 返回带ID的标签,标识单个Board的数据 providesTags: (result, error, id) => [{ type: 'Boards', id }], }), addBoard: builder.mutation({ query: payload => ({ url: 'board', method: 'POST', body: payload, }), invalidatesTags: ['Boards'], }), }), })
2. 修改Task API切片,添加标签失效逻辑
在taskApi中声明要使用的标签类型,并在任务操作的mutation中指定要失效的单个Board标签:
export const apiTaskSlice = createApi({ reducerPath: 'apiTaskSlice', baseQuery: fetchBaseQuery({ baseUrl: API_URL, prepareHeaders: headers => headers.set('Authorization', `Bearer ${token}`) }), tagTypes: ['Boards'], // 声明要使用的Board标签类型 endpoints: (builder) => ({ addCard: builder.mutation({ query: ({ listId, title, boardId }) => ({ url: `task/${boardId}`, method: 'POST', body: { title, listId }, }), // 失效对应boardId的标签,触发getBoardById重新请求 invalidatesTags: (result, error, { boardId }) => [{ type: 'Boards', id: boardId }], }), deleteTask: builder.mutation({ query: ({ taskId, boardId }) => ({ url: `task/${taskId}`, method: 'DELETE', }), // 删除任务后同样刷新对应Board的数据 invalidatesTags: (result, error, { boardId }) => [{ type: 'Boards', id: boardId }], }), }), })
改动说明
- 细粒度标签:
getBoardById返回带ID的标签,确保只有该ID对应的查询会被刷新,不会影响其他Board或全局列表的查询。 - 跨切片同步:Task API通过声明
tagTypes: ['Boards'],可以直接复用Board API的标签类型,实现跨切片的状态同步。 - 精准触发:每次添加/删除任务时,通过传入的
boardId指定要失效的标签,自动触发getBoardById重新获取最新数据。
内容的提问来源于stack exchange,提问作者Yudi Krisnandi
相关产品推荐
相关产品推荐

