使用RTK Query的应该知道它有自己的一套缓存策略
RTK Query 的一个关键特性是它对缓存数据的管理。当从服务器获取数据时,RTK Query 将在 Redux 存储中以“缓存”的形式存储数据。当对相同数据执行附加请求时,RTK Query 将提供现有的缓存数据,而不是向服务器发送附加请求。
下面提供一些清除缓存的方法
接受布尔值或数字作为时间(以秒为单位)
tsimport { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' import type { Post } from './types' export const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/' }), // global configuration for the api refetchOnMountOrArgChange: 30, endpoints: (builder) => ({ getPosts: builder.query<Post[], number>({ query: () => `posts`, }), }), })
tsximport { useGetPostsQuery } from './api' const Component = () => { const { data } = useGetPostsQuery( { count: 5 }, // this overrules the api definition setting, // forcing the query to always fetch when this component is mounted { refetchOnMountOrArgChange: true } ) return <div>...</div> }
这个也是比较常用到的一个清除缓存的方法
我们经常会比如在创建某个item时 需要更新列表数据 这个时候就可以用到 cache tag了
主要做两件事
tsimport { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query' import type { Post, User } from './types' const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/', }), tagTypes: ['Post', 'User'], endpoints: (build) => ({ getPosts: build.query<Post[], void>({ query: () => '/posts', providesTags: (result, error, arg) => result ? [...result.map(({ id }) => ({ type: 'Post' as const, id })), 'Post'] : ['Post'], }), getUsers: build.query<User[], void>({ query: () => '/users', providesTags: ['User'], }), addPost: build.mutation<Post, Omit<Post, 'id'>>({ query: (body) => ({ url: 'post', method: 'POST', body, }), // 总是使与全局 tag 'Post' 相关的缓存失效 无法针对具体的 Post 进行精确的缓存失效。 invalidatesTags: ['Post'], }), editPost: build.mutation<Post, Partial<Post> & Pick<Post, 'id'>>({ query: (body) => ({ url: `post/${body.id}`, method: 'POST', body, }), // 能够根据 mutation 的执行结果动态生成与 Post 相关的 tag,并使这些 tag 失效, 更加灵活和精确 invalidatesTags: (result, error, arg) => [{ type: 'Post', id: arg.id }], }), }), })
控制RTK 查询在应用程序窗口重新获得焦点后是否尝试重新获取所有订阅的查询
如果在 skip: true 旁边指定此选项,则直到 skip 为 false 时才计算此值。
tsimport { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' import type { Post } from './types' export const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/' }), // global configuration for the api refetchOnReconnect: true, endpoints: (builder) => ({ getPosts: builder.query<Post[], number>({ query: () => `posts`, }), }), })
tsimport { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' import { api } from './services/api' export const store = configureStore({ reducer: { [api.reducerPath]: api.reducer, }, middleware: (gDM) => gDM().concat(api.middleware), }) // enable listener behavior for the store setupListeners(store.dispatch) export type RootState = ReturnType<typeof store.getState>
控制 RTK Query 在重新获得网络连接之后是否尝试重新获取所有订阅的查询
用法及注意事项与上相同