2 回答

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

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狀態的函數,然后您才能可靠地對其進行深度克隆。
添加回答
舉報