刚接触RTK Query,请教Tags的定义、用途及相关参考资料
什么是 Tags?
Tags 就是 RTK Query 给缓存数据打的「分类标签」,核心目的是帮你精准控制缓存的失效和自动更新。简单说,你给不同的请求缓存贴上对应的标签,之后只要触发某个修改操作,就能通过标签让关联的缓存自动刷新,不用手动去调刷新接口。
核心用法场景
- 自动同步修改后的数据:比如你做了新增用户的操作,只要给新增请求配置
invalidatesTags: ['User'],所有贴了User标签的缓存(比如用户列表请求)就会自动失效并重新拉取最新数据,不用你再手动调用获取用户列表的方法。
示例代码:const userApi = createApi({ reducerPath: 'userApi', baseQuery: fetchBaseQuery({ baseUrl: '/api' }), tagTypes: ['User'], // 提前声明要用到的标签类型 endpoints: (builder) => ({ // 获取用户列表,缓存贴User标签 getUsers: builder.query({ query: () => '/users', providesTags: ['User'], }), // 新增用户,使User标签的缓存失效 addUser: builder.mutation({ query: (newUser) => ({ url: '/users', method: 'POST', body: newUser, }), invalidatesTags: ['User'], }), }), }); - 精准控制单个缓存的失效:如果是处理单个资源(比如某一个用户),可以给标签加上ID标识,这样修改单个用户时,只会让这个用户的缓存失效,不会影响整个用户列表。
示例代码:// 获取单个用户,根据用户ID生成带标识的标签 getUser: builder.query({ query: (userId) => `/users/${userId}`, providesTags: (result, error, userId) => [{ type: 'User', id: userId }], }), // 更新单个用户,只失效对应ID的用户缓存 updateUser: builder.mutation({ query: ({ id, ...data }) => ({ url: `/users/${id}`, method: 'PUT', body: data, }), invalidatesTags: (result, error, { id }) => [{ type: 'User', id: id }], }),
几个关键参数的区别
providesTags:告诉RTK Query「这个请求的缓存属于哪些标签」,相当于给缓存贴标签。invalidatesTags:告诉RTK Query「这个请求执行后,哪些标签的缓存要失效」,相当于触发关联缓存的刷新。tagTypes:在API切片的顶层声明所有要用到的标签类型,相当于提前注册标签分类,避免拼写错误或者乱加标签。
常见坑点
- 别乱用全局标签:如果所有请求都贴同一个标签,一个小修改就会触发一堆缓存刷新,浪费资源。
- 动态标签要对应参数:如果请求依赖参数(比如用户ID),一定要根据参数生成带标识的标签,不然缓存控制会不精准,比如修改了用户A,结果用户B的缓存也被刷新了。
内容的提问来源于stack exchange,提问作者Artemis
相关产品推荐
相关产品推荐

