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

React Native中film.genres.map报错:undefined is not an object

React Native: undefined is not an object (evaluating 'film.genres.map')

问题描述

我在React Native项目中遇到了如下报错:

undefined is not an object (evaluating 'film.genres.map')

除了电影类型(Genre(s))的渲染部分,其余内容都能正常显示。控制台打印的film.genres是一个正常的数组:

Array [ 
  Object { "id": 12, "name": "Aventure", }, 
  Object { "id": 14, "name": "Fantastique", }, 
  Object { "id": 10751, "name": "Familial", }, 
]

以下是我的相关代码:

componentDidMount() { 
  console.log(this.props.navigation.state.params.idFilm) 
  getFilmDetailFromApi(this.props.navigation.state.params.idFilm).then(data => { 
    this.setState({ film: data, isLoading: false, }) 
  }) 
} 

_displayFilm() { 
  if(this.state != '') { 
    const { film } = this.state 
    return ( 
      <ScrollView> 
        <Image> 
        </Image> 
        <View style={styles.overview_container}> 
          <Text style={styles.overview_title}>{film.title}</Text> 
          <Text style={styles.overview_description}>{film.overview}</Text> 
        </View> 
        <View style={styles.informations_container}> 
          <Text>Sorti le {film.release_date}</Text> 
          <Text>Note : {film.vote_average}</Text> 
          <Text>Nombre de votes : {film.vote_count}</Text> 
          <Text>Budget : {numeral(film.budget).format('0,0[.]00 $')}</Text> 
          <Text>Genre(s) : {film.genres.map((item) => { console.log(item) })}</Text> 
          <Text></Text> 
        </View> 
      </ScrollView> 
    ) 
  } 
}

为什么film.genres的map方法无法正常工作呢?

解决方案

嘿,我来帮你拆解这个问题!其实问题出在组件初始渲染的时机和错误的渲染条件判断上:

1. 核心原因:初始渲染时film.genres是undefined

你的getFilmDetailFromApi是异步请求,组件会先完成初始渲染,这时候this.state.film还没被赋值(或者初始状态里film是undefined)。而你写的渲染条件if(this.state != '')完全无效——因为this.state是一个对象,永远不会等于空字符串,所以初始渲染时会直接进入代码块,尝试访问film.genres,这时候film可能还不存在,自然就会抛出undefined is not an object的错误。

2. 具体修复步骤

第一步:修正渲染条件

把无效的判断改成检查film是否存在,并且genres是数组:

_displayFilm() { 
  const { film } = this.state;
  // 确保film存在,且genres是数组再渲染
  if(film && Array.isArray(film.genres)) { 
    return ( 
      // ... 你的原有渲染代码
    ) 
  }
  // 如果条件不满足,可以返回加载提示或者null
  return <Text>Chargement...</Text>;
}

第二步:初始化state避免undefined

在组件的构造函数里给film和genres设置初始值,这样即使异步请求还没完成,访问film.genres也不会报错:

constructor(props) {
  super(props);
  this.state = {
    film: { genres: [] }, // 初始化genres为空数组
    isLoading: true
  };
}

第三步:修复map的返回值

另外,你当前的map方法里只有console.log(item),没有返回任何JSX元素,就算不报错,也不会渲染出类型名称。需要返回一个可渲染的组件,比如:

<Text>Genre(s) : {film.genres.map((item, index) => (
  <Text key={index} style={{marginRight: 8}}>{item.name}</Text>
))}</Text>

这样修改后,不仅能解决报错问题,还能正确渲染出电影的类型列表啦!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:32:55