Reactjs JS没有从API加载任何内容,并且可以';无法使用映射获取数据,因为它为空

Reactjs JS没有从API加载任何内容,并且可以';无法使用映射获取数据,因为它为空,reactjs,Reactjs,代码接收到一个ID作为参数(已测试并工作),但是当retrieveMovieData试图从api获取关于一部电影的信息时,它将不会得到任何东西,如果我尝试通过浏览器,它会得到任何东西。 为什么我的代码没有从API加载任何东西?相同的代码在另一个页面中工作 我试着改变尽可能多的我可以尝试和测试,以了解问题,但没有找到解决它 注意:它抛出“TypeError:无法读取null的属性'map',这是它没有任何内容的原因,因为它似乎没有从API加载任何内容(测试url并正常工作)。我将添加一个hasDa

代码接收到一个ID作为参数(已测试并工作),但是当retrieveMovieData试图从api获取关于一部电影的信息时,它将不会得到任何东西,如果我尝试通过浏览器,它会得到任何东西。 为什么我的代码没有从API加载任何东西?相同的代码在另一个页面中工作

我试着改变尽可能多的我可以尝试和测试,以了解问题,但没有找到解决它


注意:它抛出“TypeError:无法读取null的属性'map',这是它没有任何内容的原因,因为它似乎没有从API加载任何内容(测试url并正常工作)。

我将添加一个hasData状态字段,并在函数返回数据时将其设置为true。这样,您可以渲染“正在加载,请等待”段落,直到数据返回,然后再渲染电影数据。例如:

  state = {
    movieData: null,
    hasData: false
  };

  async componentDidMount() {
    await this.retrieveMovieData();
  }
  async retrieveMovieData() {
    const url =
      "https://api.themoviedb.org/3/movie/" +
      this.props.match.params.movie_id +
      "?api_key=API_KEY_HERE";
    const response = await fetch(url);
    const data = await response.json();
    this.setState({ movieData: data.results, hasData: true });
  }

  render() {
    return (
      <div>
        <h3>Movie</h3>
        {this.state.hasData ? (
          this.renderMovieData()
        ) : (
          <p>Loading, please wait</p>
        )}
      </div>
    );
  }
}
状态={
movieData:null,
hasData:false
};
异步组件didmount(){
等待此消息。retrieveMovieData();
}
异步检索电影数据(){
常量url=
"https://api.themoviedb.org/3/movie/" +
this.props.match.params.movie_id+
“?api_key=api_key_HERE”;
const response=等待获取(url);
const data=wait response.json();
this.setState({movieData:data.results,hasData:true});
}
render(){
返回(
电影
{this.state.hasData(
这个文件名为renderMovieData()
) : (
正在装货,请稍候

)} ); } }

编辑:啊,我没有检查提取功能。varun gulati的回答如上所述:)

您需要首先检查阵列是否为空,然后不要安装组件。在您的情况下,应该是这样的:

 render(){
     let {movieData} = this.state;
      if(!(movieData  &&  movieData.length===0)) return null; //or any loader
      return(
        <div>
        <h3>Movie</h3>
        {this.renderMovieData()}
        </div>
      )
    }
  }

render(){
让{movieData}=this.state;
if(!(movieData&&movieData.length==0))返回null;//或任何加载程序
返回(
电影
{this.renderMovieData()}
)
}
}

您的fetch语句有问题

试试这个

fetch('https://api.themoviedb.org/3/movie/“+this.props.match.params.movie_id+”?api_key=api_key_HERE')
.then(response=>response.json())
。然后(数据=>{
console.log(数据)})

它将等待fetchapi首先解析承诺

更新:

尝试更改您的retrieveMovieData

 async retrieveMovieData(){
       fetch('https://api.themoviedb.org/3/movie/429617?api_key=5eb236e843cf6bc1114a8d8add6993a1')
       .then(response => response.json())
       .then(data => { 
         console.log(data);
         this.setState({movieData: data});
         });

   }
现在您可以在控制台中查看数据,相应地设置状态

更新2.0 如果需要单个电影数据,则渲染方法应为

renderMovieData  = ( ) =>{
return(
  <div class="one-cros-movie col-md-3 col-sm-4">
    <div class="cros-movie-wrap">
      <a href={"movie/" + this.state.movieData.id} >
        <img src={"http://image.tmdb.org/t/p/w500/" + this.state.poster_path} class="attachment-movie size-movie wp-post-image" alt="perfume_xlg" />
        <div class="cros-movie-meta">
          <span><i class="fa fa-star"></i> Rating {this.state.movieData.vote_average}</span>
          <span><i class="fa fa-eye"></i> {this.state.movieData.vote_count} votes</span>
        </div>
        <h1>
              <span>{this.state.movieData.title}</span>    </h1>
      </a>
    </div>
  </div>
)}
renderMovieData=()=>{
返回(
)}

是的,因此,当第一次调用渲染时,提取尚未完成。这是典型的你有某种。。。正在加载指示符。我如何解决这个问题?添加逻辑,使其能够优雅地处理null。您建议我做什么更改?这种更改类型会发生错误:如果我放入[],则无法读取null的属性“length”它将给出相同的错误,而不是null。请你给我代码中的更改,这样我就不会尝试应用它而失败了?我真的需要你给我更改后的代码,因为我想我会在多次尝试后弄乱它。我可以检查它是否确实通过google chrome中的inspector加载了一些内容,但是我如何才能将其发送到状态为movieData的movieData中?您得到的错误类型错误:无法读取null的属性'length',因为数据为null{movieData:data.results},您的状态未更新,现在检查更新的答案并尝试此操作,如果您仍然收到错误,请让我知道。我不想控制台。记录“数据”,我想将其存储在“状态”内的movieData中,我如何才能做到?我已尝试设置为状态变量,但我做得不对。我需要帮助