首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PokeAPI -获取口袋妖怪数据

PokeAPI -获取口袋妖怪数据
EN

Stack Overflow用户
提问于 2020-05-31 00:19:18
回答 2查看 5.3K关注 0票数 1

我刚刚开始学习React,我正在尝试使用PokeDex构建一个PokeAPI,但是我很难理解如何从PokeAPI中获取数据。我想获取第一个384口袋妖怪相关的信息。我在下面的componentDidMount()中编写了这段代码,以提取我的主要App类组件中的完整数据,并将其推到一个名为pokemonArray的数组中,然后将其设置为我的状态。

代码语言:javascript
复制
let pokemonArray = [];
/* First API fetch call to return names and URL's of first 384 Pokemon after promise is resolved.*/
fetch('https://pokeapi.co/api/v2/pokemon/?limit=384')
  .then(response => response.json())
  .then(data => {
    let results = data.results;
    let promisesArray = results.map(result => {
      return fetch(result.url).then(response => response.json()).then(data => pokemonArray.push(data));
    })
    return Promise.all(promisesArray)
  }).then(this.setState({ pokemon: pokemonArray }, () => console.log('Main Pokemon State: ', this.state.pokemon)));

}

在我的呈现方法中,我希望将这个新设置的状态作为支柱传递给一个名为PokeList的组件,如下所示

代码语言:javascript
复制
<PokeList pokemon={this.state.pokemon} />

一旦我传递它并尝试在我的PokeList组件中呈现它,如下所示

代码语言:javascript
复制
export const PokeList = ({ pokemon }) => {
    console.log(pokemon);

    return (
        <div className="pokecard-container">
            <h1>{pokemon[0].id}</h1>
        </div>
    );
}

我收到一个错误,上面写着TypeError:无法读取空的属性'0‘。工具显示使用检索到的值填充状态,以及设置道具,但它似乎认为它为空。有人能帮我解决这个问题吗?看到这个错误出来真是令人沮丧

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-31 01:22:03

您的代码有两个问题。首先,下面是一个修改后的工作版本:

代码语言:javascript
复制
fetch('https://pokeapi.co/api/v2/pokemon/?limit=2')
  .then(response => response.json())
  .then(data => {
    let results = data.results;
    let promisesArray = results.map(result => {
      return fetch(result.url).then(response => response.json());
    })
    return Promise.all(promisesArray);
  }).then((data) => this.setState({ pokemon: data }, () => console.log('Main Pokemon State: ', this.state.pokemon)));

并解释如下:

第1期:

原始代码:

代码语言:javascript
复制
let promisesArray = results.map(result => {
  return fetch(result.url).then(response => response.json()).then(data => pokemonArray.push(data));
})
return Promise.all(promisesArray)

最后一个then()回调返回pokemonArray.push(data)的结果。Array.push返回数组的长度,因此return Promise.all(promisesArray)返回数组长度的数组。

改为:

代码语言:javascript
复制
let promisesArray = results.map(result => {
  return fetch(result.url).then(response => response.json()); // Returns the data
})
return Promise.all(promisesArray)

第2期:

原始代码:

代码语言:javascript
复制
then(this.setState({ pokemon: pokemonArray }, () => console.log('Main Pokemon State: ', this.state.pokemon)));

必须向then()提供回调函数

代码语言:javascript
复制
.then((data) => this.setState({ pokemon: data }, () => console.log('Main Pokemon State: ', this.state.pokemon)));

还必须记住在创建组件时初始化状态:

代码语言:javascript
复制
constructor(props) {
  super(props);

  this.state = {
    pokemon: [],
  };
}

因此,当您呈现PokeList (<PokeList pokemon={this.state.pokemon} />)时,它将始终接收一个数组,尽管在获取数据之前它将是空的。

票数 0
EN

Stack Overflow用户

发布于 2020-05-31 01:24:27

下面是我的建议,重写您的获取代码:

代码语言:javascript
复制
class App extends Component{
 state = {
   pokemonArray : []
 }
 componentDidMount = () =>{
   fetch('https://pokeapi.co/api/v2/pokemon/?limit=384')
   .then(response => response.json())
   .then(data => {
      let results = data.results;
      this.setState({ pokemonArray : [...results]})
     console.log("Here are my pokemons",   this.state.pokemonArray)
     })


 }
...
}

我使用扩展操作符将接收到的数据复制到pokemonArray。然后,可以将数组作为支柱传递给组件。希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62110181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档