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

React Query中第二个API请求未执行问题求助

问题排查与解决

问题根因

你写的两个自定义Hook用了一模一样的Query Key:createUseAddressKey(address)。React Query是靠Query Key来区分不同查询的,当两个查询的Key完全相同时,它会直接复用第一个查询的缓存结果,不会再发起第二个请求,这就是usePortfolioData没触发api/portfolios调用的核心原因。

修复方法

给usePortfolioData的Query Key加个独特标识,让React Query认出这是另一个独立查询即可,两种方式任选:

方式一:修改Query Key生成函数

如果createUseAddressKey允许修改,给它添加类型参数来区分不同查询:

// 先更新createUseAddressKey函数
const createUseAddressKey = (address: string, queryType?: string) => {
  return queryType ? ['address-query', address, queryType] : ['address-query', address];
};

// 修改usePortfolioData的Query Key
export const usePortfolioData = (
  address: string,
  options?: UseQueryOptions<IQuery, AxiosError>
) =>
  useQuery(
    createUseAddressKey(address, 'portfolio'), // 传入独特标识"portfolio"
    () =>
      fetcherAddressArkhamTransfers(`api/portfolios`, address).then(
        ({ data }) => data
      ),
    {
      ...options,
      retry: false,
      cacheTime: MINUTES_TO_REFETCH_DATA,
      staleTime: MINUTES_TO_REFETCH_DATA,
    }
  );

// 建议给useAccountData也加上对应标识,保持规范
export const useAccountData = (
  address: string,
  options?: UseQueryOptions<IQuery, AxiosError>
) =>
  useQuery(
    createUseAddressKey(address, 'transfer'), // 传入标识"transfer"
    () =>
      fetcherAddressArkhamTransfers(`api/transfers`, address).then(
        ({ data }) => data
      ),
    {
      ...options,
      retry: false,
      cacheTime: MINUTES_TO_REFETCH_DATA,
      staleTime: MINUTES_TO_REFETCH_DATA,
    }
  );

方式二:直接扩展原Query Key

不想修改createUseAddressKey的话,直接在原Key基础上扩展添加标识:

export const usePortfolioData = (
  address: string,
  options?: UseQueryOptions<IQuery, AxiosError>
) =>
  useQuery(
    [...createUseAddressKey(address), 'portfolio'], // 扩展原Key数组,添加独特标识
    () =>
      fetcherAddressArkhamTransfers(`api/portfolios`, address).then(
        ({ data }) => data
      ),
    {
      ...options,
      retry: false,
      cacheTime: MINUTES_TO_REFETCH_DATA,
      staleTime: MINUTES_TO_REFETCH_DATA,
    }
  );

验证效果

修改完成后,两个Hook的Query Key会变成不同的:

  • useAccountData的Key:[原Key结构, 'transfer']
  • usePortfolioData的Key:[原Key结构, 'portfolio']

此时React Query会将它们视为两个独立的查询,分别发起api/transfers和api/portfolios请求。

内容的提问来源于stack exchange,提问作者Kiran S youtube channel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:22:44