2 回答

TA貢獻1828條經驗 獲得超13個贊
據我所知,改變國家通常是一個壞主意。
根據這個答案,改變狀態(tài)可能不會導致重新渲染,因為在突變過程中對狀態(tài)對象的引用不會改變。
我寧愿使用某種類似 redux 的不可變模式:
const changeProductName = (id, newName) => {
setProducts((prevState) => (
prevState.map(product=>{
if(product.id!==id){
// name is not changed since the id does not match
return product;
} else {
// change it in the case of match
return {...product, name:newName}
}
}
)
}

TA貢獻1815條經驗 獲得超6個贊
誰能解釋一下設置狀態(tài)中的上一個狀態(tài)實際上是什么?
prev 狀態(tài)是對前一個狀態(tài)的引用。它不是狀態(tài)的副本,它是位于狀態(tài)內部的對象的引用。因此,更改該對象不會更改對象引用。
因此,它不應該直接突變。相反,應通過基于 prevState 的輸入構建新對象來表示更改。
例如,如果您在更改中進行檢查,例如:
setProducts(prevState => {
prevState.filter(product => product.id == id)[0].name = newName;
console.log(prevState === products); // This will console true
return prevState;
});
另外,由于您正在使用鉤子,因此當您編寫...本身已經是產品了。因此,當您嘗試訪問 時,您將在示例中得到未定義的錯誤。setProducts((prevState) => { prevState.products}prevState.products
所以我建議你這樣做:
const changeProductName = (id, newName) => {
setProducts(prevProducts =>
prevProducts.map(product =>
product.id === id ? { ...product, name: newName } : product
)
);
};
.map將基于 prevState 構建一個新數組,并更改在函數中調用 ID 的產品的名稱。
添加回答
舉報