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

React Native类组件遍历API返回数组渲染卡片时触发Component Exception错误的问题排查

解决React类组件中map渲染卡片时“undefined is not an object”的错误

这个问题我之前也碰到过,本质是组件渲染时机和数据异步加载的冲突,咱们一步步拆解:

错误的核心原因

你在constructor里初始化this.state.results为一个空对象{},而组件的第一次render会在componentDidMount(也就是你发起API请求的地方)之前执行。这时候this.state.results.response根本不存在,是undefined,你直接调用.map()自然就会抛出"undefined is not an object"的错误。

至于控制台用for循环能正常显示,那是因为你在控制台输出的时候,API请求已经完成,response数据已经存在了,和组件第一次渲染的时机完全不一样。

两种简单有效的解决方案

方案1:给response设置初始空数组

修改constructor里的state初始化,给results.response默认一个空数组,这样第一次渲染的时候map()调用在空数组上,不会报错,等API返回数据后再更新渲染:

constructor(props){
  super(props)
  this.state = {
    results :{ response: [] }, // 初始化response为空数组
    namee:'fahad',
  };
}

方案2:渲染前做条件判断

在调用map()之前,先检查response是否存在,这里可以用ES6的可选链操作符?.,或者短路求值&&:

render() {
  const { navigate } = this.props.navigation;
  return (
    <View >
      {/* 用可选链操作符确保response存在才调用map */}
      { this.state.results.response?.map(row => (
        {/* 别忘了给列表项加唯一key,这是React列表渲染的规范 */}
        <Card key={row.country}> 
          <Card.Title>{row.population}</Card.Title>
          <Card.Divider/>
        </Card>
      ))}
    </View>
  )
}

额外提醒:别忘了加key属性

React渲染列表的时候,每个子元素都需要一个唯一的key属性,用来帮助React识别哪些元素变化了,避免不必要的重渲染。这里用row.country作为key就很合适,因为每个国家是唯一的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:17:33