当前位置: 首页 > 知识库问答 >
问题:

无法访问map函数内部的数组以将道具返回到其他组件

劳和雅
2023-03-14

我从API获取数据。我正在使用API调用构建一个由5个对象组成的数组。我想做的是迭代数组,使用每个数组索引中的数据来构建一个组件,并将道具传递给另一个组件。

我尝试过以通常的方式访问该元素:img={pokemon.name},但它始终返回未定义。当我输入控制台时。log(pokemon)我获取存储在对象数组中的单个pokemon。

import React, { Component } from "react";
import Pokecard from "./Pokecard";

async function getPokemon() {
  const randomID = Math.floor(Math.random() * 151) + 1;
  const pokeRes = await fetch(`https://pokeapi.co/api/v2/pokemon/${randomID}/`);
  const pokemonJSON = await pokeRes.json();
  return pokemonJSON;
}

function buildPokemon() {
  let pokemonArr = [];
  let builtPokemon = {};

  getPokemon()
    .then(data => {
      builtPokemon.name = data.forms[0].name;
      builtPokemon.exp = data.base_experience;
      builtPokemon.img = data.sprites.front_default;
      builtPokemon.type = data.types[0].type.name;

      pokemonArr.push(builtPokemon);
    })
    .catch(err => console.log(err));
  return pokemonArr;
}

class Pokedex extends Component {
  constructor(props) {
    super(props);
    this.state = { pokemonArr: [] };
  }
  componentDidMount() {
    const pokemonArr = [];
    for (let i = 0; i < 5; i++) {
      pokemonArr.push(buildPokemon());
    }
    this.setState({ pokemonArr });
  }
  render() {
    console.log(this.state.pokemonArr);
    return (
      <div className="Pokedex">
        {this.state.pokemonArr.map(pokemon => console.log(pokemon))}
      </div>
    );
  }
}

export default Pokedex;

应该发生的是,当我映射pokemonArr时,我想通过执行创建5个独立的pokemonthis.state.pokemonrr.map(pokemon=

我认为我的buildPokemon()函数正在工作,因为当我在componentDidMount()中调用它时,然后我在控制台中调用它。日志<代码>这个。状态pokemonar在render()函数中,我实际得到了一个数组,返回的数组中有5个不同的pokemon,并填写了正确的字段。

当我画出这个的时候。状态口袋妖怪。地图(口袋妖怪)=

共有3个答案

寇景明
2023-03-14

问题主要是如何解决promise。

数据不能立即可用,因此状态(pokemonArr)应该仅在数据可用时设置。

以下是重构的组件:

class Pokedex extends Component {
  constructor(props) {
    super(props);
    this.state = { pokemonArr: [] };
  }
  componentDidMount() {
    for (let i = 0; i < 5; i++) {
      this.getPokemon()
        .then((pokemon) => this.buildPokemon(pokemon));
    }
  }
  async getPokemon() {
    const randomID = Math.floor(Math.random() * 151) + 1;
    const pokeRes = await fetch(`https://pokeapi.co/api/v2/pokemon/${randomID}/`);

    return pokeRes.json();
  }
  setPokemon(pokemon) {
    this.setState({
      pokemonArr: [
        ...this.state.pokemonArr, pokemon
      ],
    });
  }
  buildPokemon(data) {
    let builtPokemon = {};

    builtPokemon.name = data.forms[0].name;
    builtPokemon.exp = data.base_experience;
    builtPokemon.img = data.sprites.front_default;
    builtPokemon.type = data.types[0].type.name;

    this.setPokemon(builtPokemon);
  }
  render() {
    return (
      <div className="Pokedex">
        {this.state.pokemonArr.map(pokemon => console.log(pokemon))}
      </div>
    );
  }
}
尉迟国发
2023-03-14

在第一次渲染后执行,最初你的状态是pokemonArr:[](whch是空的),所以你得到一个错误。你需要有条件地渲染像,

{this.state.pokemonArr.length > 0 && this.state.pokemonArr.map(pokemon => console.log(pokemon))}

旁注:

buildPokemon函数中,您将返回一个array,在componentDidMount中,您将其存储在array中,该数组创建了数组的数组,您只需从buildPokemon函数返回对象。

钱均
2023-03-14

您的方法有几个问题,但最主要的问题是getPokemon()是异步的。

返回的getPokemon()promise从BuildPokemon()和返回的对象从它的然后()

for()循环中,创建这些promise的数组并使用Promise。all()以在解决所有问题后设置状态

function buildPokemon() {

  let builtPokemon = {};
  // return the promise
  return getPokemon()
    .then(data => {
      builtPokemon.name = data.forms[0].name;
      builtPokemon.exp = data.base_experience;
      builtPokemon.img = data.sprites.front_default;
      builtPokemon.type = data.types[0].type.name;
      // return the object
      return builtPokemon
    });
}


componentDidMount() {
  const pokemonPromises = [];
  for (let i = 0; i < 5; i++) {
    pokemonPromises.push(buildPokemon());
  }
  Promise.all(pokemonPromises).then(pokemonArr => this.setState({ pokemonArr }));    
}
 类似资料:
  • 问题内容: 我正在使用一个模板引擎,该引擎将代码插入我想要的站点中。 我写了一个函数来测试一些很简单的东西: 问题是,$ this-> data是私有的,我无法在任何地方访问它,因此我必须使用getData();。导致我的问题。 不起作用,并且先分配值也不起作用,因为它将直接在if()块中使用。 有任何想法吗? 问题答案: 从PHP 5.4开始,可以完全做到这一点:

  • 我一直在玩新的ES6地图(),只是为了适应它,现在我们可以得到大小了,我突然想到可以有效地随机抽取地图样本,看看它是什么样子的。 显然,可以迭代遍历,将所有条目组成一个数组,然后选择随机样本。但这对大地图来说没有吸引力。 最后有一些代码通过利用地图的新可用大小来实现这一点。它比复制的效率稍高,但仍然没有吸引力。 但是Map方法keys()返回一个迭代器对象,我们通常使用它的next()方法来迭代M

  • 我有下面的子组件。道具从父级中的输入选择器更新。为什么 不更新孩子的 家长: 孩子:

  • 我正在尝试从intellij控制台访问内存中的H2数据库。我正在使用spring boot配置所有内容。连接字符串为:Spring。数据源。url=jdbc:h2:mem:testdb 当我使用intellij连接到数据库时,我看不到或查询表。我可以运行createtable命令来获取它,但仅此而已。这是该配置的图像: SHOW TABLES查询的结果不返回任何内容。 为什么我无法连接到此数据库?

  • 我试图从一个Json文件中提取一个对象列表,但是该文件以一个对象开始,该对象包含我需要的对象数组。我是一个新的改造这里是我的文件:接口 控制器 Json的开头 我的对象Pojo 所以我不需要jsonObject中的任何初始信息,我所需要的只是元素jsonArray中的对象列表,它由两个稍微不同的对象组成,一个有nodes[],一个没有。因此POJO中有2个构造函数? 我如何设置改装来处理这件事?与

  • 问题内容: 这(我的代码的简化版本)不起作用: 为什么?我要访问,因为如果失败,我想在上面记录错误。 递归地调用自身以创建目录列表,因此我担心将整体传递给自身(如中所述)可能会损害性能。 有没有一种方法可以在不传递参数的情况下访问内部?(PHP 5.2.x +) 编辑: 如果代码看起来像这样呢? 问题答案: 您必须将其传递给函数: 或将其声明为global: 如果变量不是全局变量,而是在外部函数中