【发布时间】:2022-08-09 18:38:15
【问题描述】:
我仍然是 ReactJS 的初学者,并且在渲染列表时遇到了麻烦。
我不知道为什么,一直在对我的 API 进行调用。由于我没有对 useEffect 施加任何依赖,也就是说,我应该只渲染我的函数一次。
我不明白为什么会这样。你能告诉我我做错了什么吗?
这是我输入codesandbox.io的代码
import React from \"react\";
import axios from \"axios\";
import \"./styles.css\";
const App = () => {
const BASE_URL = \"https://pokeapi.co/api/v2\";
const [pokemons, setPokemons] = React.useState([]);
const getAllPokemons = async () => {
const { data } = await axios.get(`${BASE_URL}/pokemon`);
data.results.map((pokemon) => getPokeType(pokemon));
};
const getPokeType = async (pokemon) => {
const { data } = await axios.get(pokemon.url);
setPokemons((prev) => [...prev, data]);
};
React.useEffect(() => {
getAllPokemons();
}, []);
console.log(pokemons);
return (
<div className=\"App\">
<h1>Hello CodeSandbox</h1>
{pokemons.map((pokemon) => (
<p key={pokemon.id} style={{ color: \"blue\" }}>
{pokemon.name}
</p>
))}
</div>
);
};
export default App;
非常感谢您提前。
-
这可能是因为您的 getPokeType 方法是异步的,这会导致反应生命周期发挥作用。试试这个
const datas = await Promise.all( data.results.map((pokemon) => axios.get(pokemon.url)) ); setPokemons(datas);而不是data.results.map((pokemon) => getPokeType(pokemon)); -
正如 Marko 所提到的,这是一个小的重构,可以提供您想要的效果。然后,您可以在最后只设置一次状态,无论如何这更干净。 codesandbox.io/s/stoic-leavitt-ngokv9
标签: javascript reactjs