reactjs 为什么react函数会迭代两次?

ldxq2e6h  于 2023-02-03  发布在  React
关注(0)|答案(1)|浏览(275)

我目前正在试用一个PokeAPI的项目,并且已经使用his guide进行了帮助,但是在useEffect中调用该函数时,无法摆脱该函数迭代两次的问题。
当我在useEffect中使用getAllPokemons运行以下代码时

const PokeListPage = () => {
  const [layoutToggle, setLayoutToggle] = useState(false);

  const [allPokemons, setAllPokemons] = useState([]);
  const [loadPoke, setLoadPoke] = useState(
    "https://pokeapi.co/api/v2/pokemon?limit=20"
  );

  useEffect(() => {
    getAllPokemons();
    console.log(allPokemons);
  }, []);

  const getAllPokemons = async () => {
    const res = await fetch(loadPoke);
    const data = await res.json();
    setLoadPoke(data.next);

    function createPokemonObject(result) {
      result.forEach(async (pokemon) => {
        const res = await fetch(
          `https://pokeapi.co/api/v2/pokemon/${pokemon.name}`
        );
        const data = await res.json();
        setAllPokemons((currentList) => [...currentList, data]);
      });
    }
    createPokemonObject(data.results);
    console.log(allPokemons);
  };

我得到了所有口袋妖怪中前20个对象的双重对象。
enter image description here
但是当我删除这个函数并使用一个按钮来触发这个函数时,它的行为和预期的一样。这意味着这个函数用每个口袋妖怪一个对象填充allPokemon数组。
enter image description here
我已经尝试了从其他存储库复制整个文件的一切方法,并且我不知道我已经遵循了不同的教程,但问题仍然存在。有人知道为什么吗?

x4shl7ld

x4shl7ld1#

可能是因为您将应用渲染到了一个React.Strictmode组件中,该组件会运行特定函数和方法两次,以帮助您检测意外副作用。由于副作用是一种状态update.so,因此这会触发重新渲染。
使用useEffect在组件挂载时运行一次效果。

相关问题