亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React useState/useEffect hook 未正確返回信息

React useState/useEffect hook 未正確返回信息

慕勒3428872 2022-08-04 09:32:02
我是 React 的初學者,使用 React 鉤子。我有一個函數組件,需要在頁面上顯示一些信息。我收到并正確返回 jobs 數組,我可以迭代它并成功顯示其信息,但希望也接收另一個數組:。此數組基于數組:我需要先接收,然后獲取其位置 ID,然后接收信息并將其放入我的位置數組中,以便稍后在我的信息頁面中使用。問題是,在我的表單中,當我想迭代位置時,它實際上顯示文本前面的位置,它在我的表單中重復JSX文本“Location:”三次(我有3個工作對象)。我知道我必須將該位置數組保存在我的中,但它只接受2個參數。這是我的代碼:locationjobsjobslocation.countryuseEffectfunction fetchJSON (...args) {  return fetch('/api/jobs/list-jobs', { headers: headers })    .then(r => {      if (!r.ok) {        throw new Error('HTTP error ' + r.status)      }      return r.json()    })}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(setLocations)// *** Need to handle #6 here    }  }, [jobs])  return [jobs, locations]}export default function Jobs () {  const classes = useStyles()  const [jobs, locations] = useJobs()  return ( {jobs.map(job => (   <>  <div className={classes.root} key={job.id}><Row>        <Col style={{ color: 'black' }}>Title:{job.title} </Col>        <Col>Company Name:{job.company_name} </Col>        <Col style={{ color: 'black' }}>Internal Code:{job.internal_code} </Col></Row>{locations.map(location => ( <Col key={location.id} style={{ color: 'black' }}>Location:{location.country}</Col>))}我有3個這樣的工作對象,對于每個對象,我想根據我在useEffect中收到的位置數組打印正確的位置。數組的所有其他字段都正常工作。如何正確實現位置部分?job.locationjobs
查看完整描述

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>}



查看完整回答
反對 回復 2022-08-04
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號