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

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

React過濾大數據集而不重新渲染(太多重新渲染錯誤)

React過濾大數據集而不重新渲染(太多重新渲染錯誤)

隔江千里 2023-08-10 15:46:10
我有一個非常大的對象數組,從 CSV 解析(PapaParse):import { readRemoteFile } from 'react-papaparse'    const [studentData, setStudentData] = useState(null)const [filteredStudents, setFilteredStudents] = useState([])const [loading, setLoading] = useState(true)   useEffect(() => {   grabData()}, [])    const grabData = () => {  readRemoteFile('my-data.csv', {    complete: (results) => { // this method gets called once file is finished parsing      setStudentData(results.data)      setLoading(false)    }  }}我想過濾學生數據,只顯示名為“Amber”的學生,例如:const getFilteredStudents = (name) => {  let updatedStudents = studentData.filter((student) => {    return student.name === name  }  setFilteredStudents(updatedStudents)  // Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.}if (!loading) {  getFilteredStudents('Amber')}在上面的代碼塊中,調用setFilteredStudents(updatedStudents)會導致反應錯誤。最后我只想渲染組件中過濾后的學生:render (  <div>  { filteredStudents ?    filteredStudents.map((student, index) => {      <div key={index}>        student.name      </div>    } : null  }  </div>)
查看完整描述

2 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

發生這種情況是因為您正在打電話


if (!loading) {

  getFilteredStudents('Amber')

}

每次組件渲染時,都會觸發一個新的=> getFilteredStudents,它會=> setFilteredStudents,從而導致新的重新渲染和無限循環


你應該這樣做


const grabData = () => {

  readRemoteFile('my-data.csv', {

    complete: (results) => { // this method gets called once file is finished parsing

      setStudentData(results.data);

    }

  }

}

只需按getFilteredStudents('Amber')一下按鈕即可呼叫..


查看完整回答
反對 回復 2023-08-10
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

問題是有條件的:

if (!loading) { 
     getFilteredStudents('Amber')
}

刪除它,它似乎可以工作?,F在我只需要一種更好的方式來渲染數據,因為大約有 5000 個 Amber 對象


查看完整回答
反對 回復 2023-08-10
  • 2 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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