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

React Native中useQuery不同查询数据获取差异疑问求助

在React Native中使用Apollo Client的useQuery时,为什么第二个查询必须重命名data变量?

你遇到的问题本质不是useQuery的特殊机制,而是两个常见的代码问题导致的:

1. 变量重复声明的语法冲突

在同一个作用域里,const声明的变量不允许重复定义。你的代码里如果尝试两次解构出同名的data、loading、error变量:

// 错误写法:重复声明const变量
const { loading, error, data } = useQuery(COUNTRY_QUERY);
const { loading, error, data } = useQuery(COUNTRY_CODE_QUERY);

会直接触发Identifier 'data' has already been declared的语法错误。这种情况下代码无法正常执行,最终表现为第二个data变量值为undefined——这是语法错误导致的异常,和useQuery的工作逻辑无关。

你用data: data2的方式重命名,本质是通过对象解构的重命名语法避免了变量重复声明,让代码能正常运行,自然就能拿到查询数据了。

2. 匿名查询的潜在缓存隐患(次要)

你的第二个查询是匿名的(没有指定query CountryCodeQuery这类名称),Apollo Client默认会基于查询内容生成缓存键。虽然这不会直接导致data为undefined,但匿名查询会降低代码可读性,也可能在复杂场景下引发缓存冲突。

解决方法

(1)语义化重命名所有重复变量

不要只重命名data,对所有重复的变量都进行语义化重命名,既避免语法冲突,也让代码更清晰:

const { loading: loadingCountries, error: errorCountries, data: countriesData } = useQuery(COUNTRY_QUERY);
const { loading: loadingCountry, error: errorCountry, data: countryData } = useQuery(COUNTRY_CODE_QUERY);

(2)给匿名查询添加明确名称

为第二个查询指定名称,提升可读性和缓存管理的可靠性:

export const COUNTRY_CODE_QUERY = gql`
  query CountryCodeQuery {
    country(code: "BR") {
      name
      capital
      code
      native
      emoji
      currency
    }
  }
`;

需要明确的是:useQuery返回的data属性和你解构的变量名完全无关——不管你把它命名为data还是data2,它都指向当前查询的结果。你遇到的问题核心是变量重复声明的语法错误,而非useQuery需要重命名data才能获取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:10:40