1 回答

TA貢獻1795條經驗 獲得超7個贊
您可以獲取單個作業的位置數據,但僅在使用時覆蓋位置狀態.then(setLocations)
您必須改為將位置存儲為對象,并將作業 ID 作為鍵
function useJobs () {
const [jobs, setJobs] = React.useState([])
const [locations, setLocations] = React.useState({})
React.useEffect(() => {
fetchJSON('/api/jobs/list-jobs', { headers: headers })
.then(setJobs)
}, [])
React.useEffect(() => {
for (const job of jobs) {
fetchJSON(`/api/jobs/view-location/${job.location}/`, { headers: headers })
.then((locations) => {
setLocations(prev => ({...prev, [job.id]: locations}))
})
}
}, [jobs])
return [jobs, locations]
}
但是,更好的方法是使用Promise.all一次性更新所有位置
function useJobs () {
const [jobs, setJobs] = React.useState([])
const [locations, setLocations] = React.useState({})
React.useEffect(() => {
fetchJSON('/api/jobs/list-jobs', { headers: headers })
.then(setJobs)
}, [])
` React.useEffect(() => {
async function fetchLocations() {
const promises = [];
for (const job of jobs) {
promises.push(fetchJSON(`/api/jobs/view-location/${job.location}/`, { headers: headers })
.then((locations) => {
return {[job.id]: locations }
}))
}
const data = await Promise.all(promises);
setLocations(prev => Object.assign({}, ...data))
}
fetchLocations();
}, [jobs])
return [jobs, locations]
}
現在您必須注意,對應于每個作業ID的位置只是一個對象而不是數組(根據聊天中的討論),因此您不需要映射
{locations[job.id] && <Col key={locations[job.id].id} style={{ color: 'black' }}>Location:{locations[job.id].country}</Col>}
添加回答
舉報