You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:22:11