我刚试着用Poke API列出所有来自1代的口袋妖怪,但是在用axios和Map数组获得数据后,我收到了重复的项目。你有什么想法如何修复它吗?这是我第一个用API的项目。
import React from "react";
import Card from "./Card";
import axios from "axios";
export default function Main() {
const [allPokemons, setAllPokemons] = React.useState([]);
React.useEffect(() => {
axios.get("https://pokeapi.co/api/v2/pokemon?limit=151").then((res) => {
const pokeUrls = res.data.results.map((pokemon) => pokemon.url);
pokeUrls.map((url) =>
axios.get(url).then((res) => {
setAllPokemons((urls) => [...urls, res.data]);
})
);
});
}, [0]);
console.log(allPokemons);
const pokemonCard = allPokemons.map((pokemon) => (
<Card
name={pokemon.name}
key={pokemon.id}
id={pokemon.id}
img={pokemon.sprites.front_default}
type={pokemon.types[0].type.name}
/>
));
return <div className="main-container">{pokemonCard}</div>;
}
我试图改变:
pokeUrls.map((url) =>
axios.get(url).then((res) => {
setAllPokemons((urls) => [...urls, res.data]);
})
);
});
至:
pokeUrls.map((url) =>
axios.get(url).then((res) => {
setAllPokemons(res.data);
})
);
});
但不幸的是,在这种情况下,我收到了错误:“未捕获的类型错误:allPokemons.map不是函数”
1条答案
按热度按时间lf5gs5x21#
我看到三个问题......
1.在效果挂钩的依赖项中使用
[0]
是没有意义的。1.内部请求将按照响应最快的顺序进行解析,这意味着第一个请求的结果顺序不会是你最终得到的状态顺序。
1.因为你的效果钩子只添加到状态数据中,所以如果它运行多次,你最终会得到重复的结果。
尝试仅解析所有数据一次,以保持顺序和干净状态...
和组件中
我还怀疑你看到了多个日志条目。这是因为你的状态在每次收到响应时都会更新,这将导致多个渲染,从而导致多个
console.log(allPokemons)
。请注意,这并不意味着你有重复的数据。我强烈建议**不要使用
console.log()
**进行简单的日志记录之外的任何事情。只要使用您的数据,而不是担心它在控制台中的外观。