【发布时间】:2021-10-01 13:48:45
【问题描述】:
我正在尝试使用 useState Hook 填充数组。这个项目是用 Next.js 和 Tailwind 制作的。
在 map 函数的每次迭代中,我想在数组末尾添加一个项目,直到没有剩余项目为止。
我的目标是拥有一个充满项目的有状态数组,以便我可以操作所有项目。
谢谢。
index.js
import { useState } from "react";
import Head from "next/head";
import Image from "next/image";
import requests from "../components/requests";
import Content from "../components/Content";
import Header from "../components/Header";
export const getStaticProps = async () => {
const res = await fetch("https://pokeapi.co/api/v2/pokemon?limit=2000/");
const pokemonData = await res.json();
return {
props: { pokemon: pokemonData },
};
};
export default function Home({ pokemon }) {
return (
<>
<Header />
<main className="flex flex-col items-center justify-center sm:flex-row sm:flex-wrap">
{pokemon.results.map((pokemon) => (
<Content key={pokemon.name} pokemon={pokemon} />
))}
</main>
</>
);
}
内容.js
import React, { useState, useEffect } from "react";
import Image from "next/image";
const Content = ({ pokemon }) => {
const [Pokemon, setPokemon] = useState({ name: [] });
// name.forEach((name) => name[0].toUpperCase() + name.substring(1));
const url = pokemon.url;
const pokemonIndex = url.split("/")[url.split("/").length - 2];
const imageUrl = `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemonIndex}.png`;
useEffect(() => {
setPokemon((prevState) => ({
...prevState,
name: prevState.name.concat(pokemon.name),
}));
}, [pokemon]);
console.log(Pokemon);
return (
<div className="p-5">
<h1 className="text-center text-3xl font-bold">{pokemon.name}</h1>
{/* <Image src={Pokemon.imageUrl} width="250" height="250" /> */}
</div>
);
};
export default Content;
【问题讨论】:
-
您的问题最初并不清楚,看起来好像您只是在
concat通话中错过了[]。但现在看来您正在尝试创建一个包含所有已渲染口袋妖怪的状态,该状态应该由您的所有Content组件共享。首先,您是否真的需要从每个Content修改Pokemons如果没有,那么您可以简单地将其作为道具传递。其次,您确定不能使用传递给Content或类似方式的一些额外道具从父级处理。第三,如果两者都不是,请参考this answer。
标签: javascript reactjs react-hooks next.js use-state