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

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

地圖中的動態類名在更新后不會改變

地圖中的動態類名在更新后不會改變

慕沐林林 2022-10-13 09:43:26
當映射為循環遍歷項目的變量中的更改className時,我正在嘗試更新我的反應。activesites發生的情況是,如果活動狀態更改為或反之亦然, className“非活動”不會消失。true代碼:// Context: this code is inside of the componentconst [sites, setSites] = useState([]);  <--- Updated dynamically with fetch()const changeActive = (id) => {   const tmpSites = sites;   for (const s in tmpSites) {      if (tmpSites[s].id === id) {         tmpSites[s].active = !Boolean(tmpSites[s].active);      }   }   setSites(tmpSites);};return (    {sites.length ? sites.map((item, i) => {       return (          <tr className={`${!Boolean(item.active) ? 'inactive' : ''}`} key={item.id}>              // inbetween data          </tr>       )    }) : null})
查看完整描述

2 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

您需要創建站點數組的副本并對副本進行更改,然后將其設置為狀態。永遠不要直接改變狀態,因為它可能不會導致重新渲染,因為我們正在使用相同的對象引用更新狀態。


const changeActive = (id) => {

   const tmpSites = [...sites];

   for (const s in tmpSites) {

      if (tmpSites[s].id === id) {

         tmpSites[s].active = !Boolean(tmpSites[s].active);

      }

   }

   setSites(tmpSites);

};


查看完整回答
反對 回復 2022-10-13
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

因為您正在改變原始站點對象而不是在進行更改之前對其進行克隆,所以useState(“setSites”)實際上不會重新呈現組件,因為它無法將以前的對象與當前對象進行比較,因為它們是相同的。


您必須sites對對象數組進行深度克?。?/p>


const changeActive = (id) => {

   setSites(sites => {

     sites.map(site => ({  // ← first-level clone

        ...site            // ← second-level clone

        active: site.id === id ? !site.active : site.active

     }))

   })

}

必須使用返回當前setSites狀態的函數,然后您才能可靠地對其進行深度克隆。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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