我正在尝试编写一个 React 功能组件,它请求一个 API 中跨多个页面公开的人员列表:
https://swapi.dev/api/people/?page=9
我知道目前有九个页面,但这在未来可能会改变,所以我希望我的组件继续请求页面,直到没有更多页面,并在"results"每个响应主体的位中积累和存储人员。我正在尝试使用useState和useEffect钩子来做到这一点。
是否有解决这个问题的通用方法,通常被认为是最好的方法?有人可以告诉我如何修改我现有的代码以使其以最佳方式工作吗?
我当前的代码导致浏览器无休止地加载。
在第一次也是唯一一次执行中尝试处理整个过程是不是我错了useEffect?我是否应该useState有一个依赖数组被传递,page以便useEffect每次page更新时再次执行?
import React, { useState, useEffect } from 'react';
function GetAllPeople() {
const [page, setPage] = useState(1)
const [people, setPeople] = useState([]);
const [gotEveryone, setGotEveryone] = useState(false)
const [error, setError] = useState(null)
const requestData = () => (
fetch(`https://swapi.dev/api/people/?page=${page}`)
.then(res => {
if (res.ok) {
let response = res.json()
setPeople(people.concat(response.results))
setPage(page + 1)
} else if(res.status === 404) {
setGotEveryone(true)
} else {
setError(res.status)
return Promise.reject('some other error: ' + res.status)
}
})
)
useEffect(() => {
while(gotEveryone === false) {
if (!error) {
requestData()
}
}
})
return (
<div>
<ul>
{people.map((person, index) =>
<li key={index}>
{person.name}
</li>
)}
</ul>
</div>
)
}
export default GetAllPeople;
