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