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

React Native中无法访问API返回JSON值的技术求助

解决React Native中API数据展示的问题

嗨,第一次接触React Native就尝试调用API展示数据,已经很棒啦~咱们一步步来解决你的问题:

首先,先理清API返回的数据结构:你调用的鸡尾酒API返回的是一个包含drinks数组的对象,所以你之前直接把整个responseJson存到data里,导致data其实是{ drinks: [...] }这样的结构,而不是直接的数组。这就是你没法直接访问data.idDrink的原因哦。

第一步:修正数据存储

先修改你的API请求函数,把responseJson.drinks存到state里,这样data就变成了饮品对象的数组:

const getApiInformations = async () => { 
  try {
    const response = await fetch('https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita'); 
    const responseJson = await response.json(); 
    setData(responseJson.drinks); // 这里只存drinks数组
  } catch (error) {
    console.error('请求出错啦:', error);
  }
} 

第二步:处理异步加载状态

因为API请求是异步的,页面初始渲染时data还是空数组,直接访问元素会报错。所以我们可以加个加载状态,或者用可选链来处理:

// 新增一个loading状态
const [loading, setLoading] = useState(true);

// 在请求完成后更新loading状态
const getApiInformations = async () => { 
  try {
    const response = await fetch('https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita'); 
    const responseJson = await response.json(); 
    setData(responseJson.drinks); 
    setLoading(false); // 请求完成,加载结束
  } catch (error) {
    console.error('请求出错啦:', error);
    setLoading(false);
  }
} 

第三步:展示数据

现在data是饮品数组了,你可以选择遍历所有饮品或者只展示单个饮品:

方式1:遍历所有饮品(推荐用map)

用数组的map方法遍历每个饮品对象,展示对应的属性:

return ( 
  <View style={{padding: 16}}> 
    {loading ? (
      <Text>加载中...</Text>
    ) : (
      data.map((drink) => (
        <View key={drink.idDrink} style={{marginBottom: 20}}>
          <Text style={{fontSize: 20, fontWeight: 'bold'}}>{drink.strDrink}</Text>
          <Text>饮品ID: {drink.idDrink}</Text>
          {/* 处理可能为null的属性,比如strTags */}
          {drink.strTags && <Text>标签: {drink.strTags}</Text>}
        </View>
      ))
    )}
  </View> 
);

这里用drink.idDrink作为key,比用index更稳定哦~

方式2:只展示第一个饮品

如果只想看第一个饮品的信息,可以这样写:

return ( 
  <View style={{padding: 16}}> 
    {loading ? (
      <Text>加载中...</Text>
    ) : data.length > 0 ? (
      <View>
        <Text>第一个饮品: {data[0].strDrink}</Text>
        <Text>ID: {data[0].idDrink}</Text>
      </View>
    ) : (
      <Text>没有找到饮品数据</Text>
    )}
  </View> 
);

小提示:可选链的使用

如果你不想加loading状态,也可以用可选链操作符?.来避免报错,比如:

<Text>{data?.[0]?.strDrink}</Text>

这样当data为空或者data[0]不存在时,不会抛出错误,只会显示空内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:27:41