我从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,并填写了正确的字段。
当我画出这个的时候。状态口袋妖怪。地图(口袋妖怪)=
问题主要是如何解决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>
);
}
}
在第一次渲染后执行,最初你的状态是pokemonArr:[](whch是空的),所以你得到一个错误。你需要有条件地渲染像,
{this.state.pokemonArr.length > 0 && this.state.pokemonArr.map(pokemon => console.log(pokemon))}
旁注:
在buildPokemon
函数中,您将返回一个array
,在componentDidMount
中,您将其存储在array
中,该数组创建了数组的数组,您只需从
buildPokemon
函数返回对象。
您的方法有几个问题,但最主要的问题是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: 如果变量不是全局变量,而是在外部函数中