开发者问题收集

React-native .map undefined 不是对象

2020-04-29
3636

这是我的代码:

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 的 Console.log:

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

我遇到了这个错误:

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

一切都正常,但类型不对,有人知道为什么 .map 无法与我的对象数组正确配合吗?谢谢。

2个回答

我将介绍以下步骤:

1.首先,在您的类组件中添加初始状态值

  state = {
    film: null,
    isLoading: false,
  };

2.其次,您可以在执行 API 调用之前,在 componentDidMount 中触发 isLoading 布尔值为 true

  componentDidMount() {
    const { navigation } = this.props;
    this.setState({ isLoading: true });

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

3.现在我们可以使用此 isLoading 属性在渲染影片之前渲染微调器或任何加载 UI,因为它们尚无法访问。

_displayFilm() {
    const { film, isLoading } = this.state;

    if (isLoading) {
      return <View>Loading films...</View>;
    }

    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>
    );
  }

希望有效。如果您有任何问题,请告诉我!

lndgalante
2020-04-29

请尝试

...
<Text>Genre(s) : {(film && film.genres) && film.genres.map((item) => {
   console.log(item)
})}</Text>
...

...
<Text>Genre(s) : {(film && film.genres) ? film.genres.map((item) => {
   console.log(item)
}) : null}</Text>
...
Shing Ho Tan
2020-04-29