reactjs - 如何在 React 中将多个响应附加到 useState?
问题描述
希望你能帮我解决这个问题!我正在发送多个 HTTP 请求以获取电影列表。目前,我正在使用临时变量 favMovies 并将所有结果推送给它,然后在下一个 .then() 设置状态。这很好用,但我放了一个 TODO 评论,我觉得有更好的方法来填充状态而无需额外的 .then()。目前,如果我取消注释我的 TODO,我只会将 1 部电影添加到我的状态中......我显然错过了一些东西......任何人都可以帮忙吗?
import React, { useState, useEffect } from 'react';
import axios from 'axios';
interface Movie {
Title: string;
}
function App() {
const [favouriteMovies, setFavouriteMovies] = useState<Movie[]>([]);
useEffect(() => {
const url = 'http://www.omdbapi.com/?apikey=<API_KEY>&i=';
const ids = ['t1', 't2', 't3'];
const promises = [];
const favMovies: Movie[] = [];
const requests = ids.map((id) => `${url}${id}`);
for (let i = 0; i < requests.length; i++) {
promises.push(axios.get(requests[i]));
}
axios
.all(promises)
.then(
axios.spread((...args) => {
for (let i = 0; i < args.length; i++) {
favMovies[i] = args[i].data;
// TODO: investigate why it's not appending all movies, but the last/first one
// setFavouriteMovies([...favouriteMovies, args[i].data]);
}
})
)
.then(() => {
setFavouriteMovies(favMovies);
});
}, []);
return (
<div className='App'>
{favouriteMovies.length
? favouriteMovies.map((m: any) => (
<div key={Math.random()}>{m.Title}</div>
))
: null}
</div>
);
}
export default App;
解决方案
状态更改是排队的。根据之前的状态定义更改,而不是您可以在组件范围内直接引用的状态。
setFavouriteMovies((previousMovies) => [...previousMovies, args[i].data]);
推荐阅读
- python - Pyparsing nested transformString
- java - 在 ExifTool 输出中包含带有未指定标记的重复项
- javascript - Puppeteer - 无法选择页面内部的选项卡
- python - 使用sqlalchemy和sybase时如何防止pandas数据框在#tmp周围添加双引号?
- jquery - 如何检测第一个字母是否不包含连字符
- snowflake-cloud-data-platform - 列出雪花中特定表中具有数据类型的所有列
- powershell - 如何快速删除 PowerShell 中的多个 IIS 绑定?
- python - 判断一个字符串是否是回文
- c - 分段错误(核心转储)将表单数组复制到字符串
- python - 如何使数字的所有数字组合低于某个numpy整数数组