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

使用TanStack Query(React)检查对象是否在分页查询缓存中

如何用React Query检查对象ID是否存在于任意分页缓存中

当然可以实现这个需求,核心思路是遍历React Query中所有相关的分页查询缓存,逐一检查目标ID是否存在。

具体实现步骤

  • 首先通过useQueryClient获取QueryClient实例,这是操作缓存的入口。
  • 从QueryClient中拿到整个查询缓存,遍历所有缓存条目。
  • 过滤出和你的分页API相关的缓存条目(比如以['character', ...]为queryKey的请求)。
  • 对每个有效缓存条目(状态为成功的),取出返回的列表数据,检查是否包含目标ID的对象。

代码示例

可以封装一个自定义Hook来复用这个检查逻辑:

import { useQueryClient } from '@tanstack/react-query';

export function useIsCharacterInCache(targetId) {
  const queryClient = useQueryClient();
  const queryCache = queryClient.getQueryCache();

  // 遍历所有缓存条目
  for (const entry of queryCache.getAll()) {
    const { queryKey, state } = entry;
    // 过滤出字符分页查询的缓存(根据你的queryKey规则调整)
    if (queryKey[0] === 'character' && state.status === 'success') {
      // 假设API返回的结构是{ results: [...] }
      const characters = state.data?.results || [];
      // 检查是否存在目标ID的对象
      if (characters.some(char => char.id === targetId)) {
        return true;
      }
    }
  }
  return false;
}

使用方式

在组件里直接调用这个Hook即可:

function CharacterCheck({ characterId }) {
  const isInCache = useIsCharacterInCache(characterId);

  return (
    <div>
      该角色{isInCache ? '已存在于缓存中' : '未在缓存中找到'}
    </div>
  );
}

注意事项

  • 要根据你实际的queryKey规则调整过滤条件,比如如果你的分页请求queryKey是['characters', { page: 4, name: 'ric' }],那过滤时就检查queryKey[0] === 'characters'。
  • 如果API返回的数据结构不同(比如直接返回数组而不是包含results的对象),要对应修改数据提取的逻辑。
  • 这种遍历缓存的操作在缓存条目很多时可能有性能损耗,如果是高频调用,可以考虑维护一个单独的ID映射表,在每次分页请求成功后更新这个表,后续检查直接查表会更高效。

内容的提问来源于stack exchange,提问作者killjoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:30:53