如何在 React.js 中呈现页面之前等待提取完成
How to wait for fetch to complete before rendering page in React.js
在这个 React 组件中,我试图从 GIPHY API 获取数据并在另一个组件中呈现它。提取工作正常,但是 this.state.gifs.map
returns 一个错误,因为它 运行s 在提取完成和状态设置之前。我曾尝试将 Hooks 与 async/await 一起使用,但这似乎也没有用。如何在设置状态后创建我的 gifArray
,这样我就不会尝试 运行 .map
空数组。
import React, {Component} from 'react'
import GifCard from './gifCard.js'
import './App.css'
export default class GifContainer extends Component{
state = {
gifs: []
}
componentDidMount(){
fetch('http://api.giphy.com/v1/gifs/search?q=ryan+gosling&api_key=KnzVMdxReB873Hngy23QGKAJh6WtUnmz&limit=5')
.then(res => res.json())
.then(gifs => {
this.setState({gifs})
})
}
render(){
const gifArray = this.state.gifs.map((gif) => {
return <GifCard key={gif.name} gif={gif}/>
})
return(
<div>
<h1 id="heading">Gif Search</h1>
<div id='gifContainer'>
{gifArray}
</div>
</div>
)}
}
你必须先检查 gifs 数组是否不为空。当setState完成后,render会再次触发,这次会有gif进行贴图。
let gifArray = '';
if (this.state.gifs.length > 0) {
gifArray = this.state.gifs.map((gif) => {
return <GifCard key={gif.name} gif={gif}/>
})
}
您的加载和状态管理实际上很好 - 运行空数组上的映射不会导致错误。
您的问题实际上与您取回的数据有关。我检查了您正在使用的 URL 的响应,它 returns 是一个包含数据和分页详细信息的对象,如下所示:
{
data: [
// The gif array
],
pagination: {...},
meta: {...}
}
在此对象上使用 map
会给您一个错误。 gif 数组位于您应该使用的 data
属性 中 - 例如而不是:
this.setState({gifs})
您可以使用:
this.setState({gifs: gifs.data})
在这个 React 组件中,我试图从 GIPHY API 获取数据并在另一个组件中呈现它。提取工作正常,但是 this.state.gifs.map
returns 一个错误,因为它 运行s 在提取完成和状态设置之前。我曾尝试将 Hooks 与 async/await 一起使用,但这似乎也没有用。如何在设置状态后创建我的 gifArray
,这样我就不会尝试 运行 .map
空数组。
import React, {Component} from 'react'
import GifCard from './gifCard.js'
import './App.css'
export default class GifContainer extends Component{
state = {
gifs: []
}
componentDidMount(){
fetch('http://api.giphy.com/v1/gifs/search?q=ryan+gosling&api_key=KnzVMdxReB873Hngy23QGKAJh6WtUnmz&limit=5')
.then(res => res.json())
.then(gifs => {
this.setState({gifs})
})
}
render(){
const gifArray = this.state.gifs.map((gif) => {
return <GifCard key={gif.name} gif={gif}/>
})
return(
<div>
<h1 id="heading">Gif Search</h1>
<div id='gifContainer'>
{gifArray}
</div>
</div>
)}
}
你必须先检查 gifs 数组是否不为空。当setState完成后,render会再次触发,这次会有gif进行贴图。
let gifArray = '';
if (this.state.gifs.length > 0) {
gifArray = this.state.gifs.map((gif) => {
return <GifCard key={gif.name} gif={gif}/>
})
}
您的加载和状态管理实际上很好 - 运行空数组上的映射不会导致错误。
您的问题实际上与您取回的数据有关。我检查了您正在使用的 URL 的响应,它 returns 是一个包含数据和分页详细信息的对象,如下所示:
{
data: [
// The gif array
],
pagination: {...},
meta: {...}
}
在此对象上使用 map
会给您一个错误。 gif 数组位于您应该使用的 data
属性 中 - 例如而不是:
this.setState({gifs})
您可以使用:
this.setState({gifs: gifs.data})