javascript - 关于我在星球大战应用程序中遇到的问题

标签 javascript reactjs fetch

首先,早上好。 我正在做一个关于 React 的项目。我试图提取的数据的链接是 https://swapi.co/api/films/1/

我的目标是在我的 MovieDetail 页面上列出电影数据。到目前为止没有问题,片名、上映日期、导演等字符串字符数据都可以打印屏幕。

但是,当我想打印属于电影的字符时,即使我在返回之前在 this.state.characters 中显示了序列,我也无法在屏幕上列出这些字符。
虽然我用自己的方式用不同的方法尝试了大约2-3天,但我没有成功。现在在代码中我只是想获取电影中的 Angular 色。

我对其他标题、出版日期等数据没有任何问题。我的项目的当前版本可在 https://github.com/kasim444/Javascript-Camp-2019/tree/master/challenges/star-wars-app 获取。 。真正的问题是我经历过的 MovieDetails.js 中的组件。如果你能帮助我,我将不胜感激。我不知道我错过了哪一点。

我尝试用钩子(Hook)来做。我只是尝试用 fetch 方法来做。

import React, {Component} from 'react';
import axios from "axios";

class MovieDetails extends Component {
  state = {
    director:null,
    episode_id:null,
    opening_crawl:null,
    producer:null,
    release_date:null,
    title:null,
    loading:true,
    characters:[],
  };
  async componentDidMount() {

    const movieId = this.props.match.params.id;
    let characterNames = [];

    const movieDetail = await  axios.get(`https://swapi.co/api/films/${movieId}/`);

    const charactersFetchLinks = movieDetail.data.characters.slice(0, 10);

    const promisesData = await charactersFetchLinks.map( link => axios.get(link) );
    axios.all(promisesData).then(value => value.map(val => {
      characterNames.push(val.data.name);
      // console.log(val.data.name);
    }));

    this.setState({characters: characterNames, loading:false});
    debugger;
  }



  renderLoading() {
    return <div>Loading...</div>;
  }
  render() {
    // console.log(this.state.characters);
      return (
        <div>
          Test
          {!this.state.loading &&  this.state.characters.map(characterName => characterName) }
        </div>
      );
    }
  }

  export default MovieDetails;

最佳答案

由于 axis.all 是异步操作,因此您需要在数据获取完成之前设置 this.setState({characters: characterNames, loading: false}) .

因此您可以将 this.setState 语句移至 then 内。 您可以跟随
Edit so.answer.57130574

请注意,我将 value.map(val => {) 更改为 value.forEach(val => {) 以使用 .forEach 而不是 .map,因为它不返回任何值(或用它做任何事情)。

class MovieDetails extends Component {
  state = {
   // omitted for brevity
  };
  async componentDidMount() {
    const movieId = this.props.match.params.id;
    let characterNames = [];
    const movieDetail = await axios.get(
      `https://swapi.co/api/films/${movieId}/`
    );
    const charactersFetchLinks = movieDetail.data.characters.slice(0, 10);
    const promisesData = await charactersFetchLinks.map(link =>
      axios.get(link)
    );
    axios.all(promisesData).then(value =>

      // I changed the `.map` to `.forEach` as you aren't returning anything.
      value.forEach(val => {
        characterNames.push(val.data.name);
        // console.log(val.data.name);
        this.setState({ characters: characterNames, loading: false });
      })
    );
    debugger;
  }

  renderLoading() {
    return <div>Loading...</div>;
  }
  render() {
    return (
      <ul>
        {!this.state.loading &&
          this.state.characters.map(characterName => (
            <li key={characterName}>{characterName}</li>
          ))}
      </ul>
    );
  }
}

您可以在下面看到工作屏幕。 demo

关于javascript - 关于我在星球大战应用程序中遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57130574/

相关文章:

javascript - 如何使用下划线js从对象数组中查找字符串?

javascript - 由于范围问题,ng-model 无法工作

javascript - 如何为用户控件编写正确的 react 代码?

python - fetch --nohooks --no-history chromium 抛出错误 : depot_tools/fetch: line 8: exec: python: not found

javascript - Fetch API 什么时候应该显式设置 `Content-Type` header ?

javascript - GridView 页面索引更改事件导致 JavaScript 运行时错误

javascript - Bootstrap Formwizard - 如果提交 ajax 响应的每个页面表单出现错误,则防止滚动到下一步

javascript - 在 componentDidMount 中获取 Prop

reactjs - 在 React Native 中使用 Expo-Route 设置所有 View 的背景颜色

javascript - 使用javascript从数据库中获取数据