如何在React.js中呈现页面之前等待获取完成

时间:2020-03-05 04:59:07

标签: javascript reactjs fetch giphy giphy-api

在这个React组件中,我试图从GIPHY API获取数据并将其呈现在另一个组件中。提取工作正常,但是this.state.gifs.map返回错误,因为它在提取完成并设置状态之前运行。我已经尝试过将aooks与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>

    )}

}

2 个答案:

答案 0 :(得分:2)

您必须首先检查gifs数组是否为空。 setState完成后,渲染将再次触发,这一次将有gif映射。

    let gifArray = '';

    if (this.state.gifs.length > 0) {
        gifArray = this.state.gifs.map((gif) => {
          return <GifCard key={gif.name} gif={gif}/>
        })
    }

答案 1 :(得分:1)

您的加载和状态管理实际上很好-在空数组上运行map不会导致错误。

您的问题实际上与您获取的数据有关。我检查了您正在使用的URL的响应,它返回了一个具有数据和页面调度详细信息的对象,如下所示:

{
  data: [
    // The gif array
  ],
  pagination: {...},
  meta: {...}
}

在该对象上使用map会给您一个错误。 gif数组位于data属性中,您应该使用-例如代替:

this.setState({gifs})

您可以使用:

this.setState({gifs: gifs.data})