axios Map从API提取的数组后元素重复

ar7v8xwq  于 2022-12-12  发布在  iOS
关注(0)|答案(1)|浏览(137)

我刚试着用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不是函数”

lf5gs5x2

lf5gs5x21#

我看到三个问题......
1.在效果挂钩的依赖项中使用[0]是没有意义的。
1.内部请求将按照响应最快的顺序进行解析,这意味着第一个请求的结果顺序不会是你最终得到的状态顺序。
1.因为你的效果钩子只添加到状态数据中,所以如果它运行多次,你最终会得到重复的结果。
尝试仅解析所有数据一次,以保持顺序和干净状态...

const getAllPokemon = async (limit = 151) => {
  const {
    data: { results },
  } = await axios.get("https://pokeapi.co/api/v2/pokemon", {
    params: { limit },
  });

  return Promise.all(
    results.map(async ({ url }) => (await axios.get(url)).data)
  );
};

和组件中

useEffect(() => {
  getAllPokemon().then(setAllPokemons).catch(console.error);
}, []);

我还怀疑你看到了多个日志条目。这是因为你的状态在每次收到响应时都会更新,这将导致多个渲染,从而导致多个console.log(allPokemons)。请注意,这并不意味着你有重复的数据。
我强烈建议**不要使用console.log()**进行简单的日志记录之外的任何事情。只要使用您的数据,而不是担心它在控制台中的外观。

相关问题