React项目中能否在不存储结果至全局状态的情况下使用RTK Query?
如何让RTK Query不全局存储API调用状态
RTK Query基于Redux设计,默认会把查询状态全局缓存,但确实有几种方式可以控制缓存行为,避免全局状态堆积过多无用数据:
- 缩短未使用数据的缓存时长
RTK Query默认缓存未使用的数据5分钟,你可以在createApi的全局配置或单个查询里设置keepUnusedDataFor参数,把值设得极小(比如0或1秒)。这样组件卸载或不再使用该查询数据时,缓存会立刻被清理,不会在全局状态里留存。示例代码:
const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/api' }), keepUnusedDataFor: 0, // 全局生效,所有查询都适用 endpoints: (builder) => ({ getUsers: builder.query({ query: () => '/users', // 也可以单独给这个查询设置专属时长 // keepUnusedDataFor: 1 }), }), });
- 手动清除指定查询的缓存
使用useQuery或useLazyQuery返回的remove方法,在组件卸载或不再需要数据时主动清除对应查询的缓存。比如在组件的清理函数里调用:
const { data, remove } = useGetUsersQuery(); useEffect(() => { return () => { remove(); // 组件卸载时清除该查询的全局缓存 }; }, [remove]);
如果用懒加载查询,还可以把数据存到组件本地useState后立刻清除全局缓存:
const [localData, setLocalData] = useState(null); const [trigger, { data, remove }] = useLazyGetUsersQuery(); const fetchUsers = async () => { const result = await trigger(); setLocalData(result.data); remove(); // 清除全局缓存,只保留本地状态 };
- 将数据存到组件本地状态,跳过全局缓存
在查询的onSuccess回调里把返回数据直接存入组件的useState,同时设置keepUnusedDataFor: 0让全局缓存立刻失效。这样全局状态里不会保留数据,所有数据只存在组件本地:
const [localData, setLocalData] = useState(null); const { data } = useGetUsersQuery(undefined, { onSuccess: (response) => { setLocalData(response); }, keepUnusedDataFor: 0, }); // 后续直接使用localData即可
- 自定义缓存淘汰策略
如果需要保留部分缓存但不想无限制堆积,可以自定义cacheReducer实现LRU(最近最少使用)缓存,限制缓存的最大条目数。比如:
const api = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/api' }), cacheReducer: (state, action) => { const newState = api.internalActions.defaultCacheReducer(state, action); // 限制缓存最多10条数据 const cacheKeys = Object.keys(newState.queries); if (cacheKeys.length > 10) { // 删除最早创建的缓存条目 const oldestKey = cacheKeys.sort((a, b) => newState.queries[a].startedTimeStamp - newState.queries[b].startedTimeStamp)[0]; delete newState.queries[oldestKey]; } return newState; }, endpoints: (builder) => ({ /* 定义你的接口 */ }), });
内容的提问来源于stack exchange,提问作者Roselle Tabuena
相关产品推荐
相关产品推荐

