我收到“exampleState”不可迭代的錯誤,但為什么呢?
假設我有一個狀態變數,其中包含一個簡單的物件陣列
const [exampleState, setExampleState] = useState([
{
id: 1,
name: 'John'
},
{
id: 2,
name: 'Mary'
}
])
我想有條件地更改這些物件的值。我認為帶有條件的回圈是一種簡單的方法。我嘗試了以下...
for (let item of exampleState) {
if (item.name === 'John') {
setExampleState({...exampleState, name: 'Michael'})
}
}
但我收到以下錯誤:'TypeError' exampleState is not iterable
我應該怎么做呢?
uj5u.com熱心網友回復:
你可以map像這樣使用
setExampleState(state => state.map(s => s.name === 'John'?{...s, name:'Michael' }: s))
如果你在回圈中設定狀態,你總是用一個元素覆寫你的陣列
uj5u.com熱心網友回復:
首先,一般來說,解決這個問題的常用方法是盡可能少地更新狀態。其次,您試圖用一個物件更新狀態的值,而它在初始化時是一個串列。這可以使用單個更新來實作:
setExampleState(...exampleState.map((user) => {
if (user.name === 'John') {
user.name = 'Michael';
}
return user;
}));
uj5u.com熱心網友回復:
您應該檢查immer庫,它非常適合操作這樣的不可變資料結構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/492016.html
標籤:javascript 反应 反应钩子
上一篇:如何向物件添加資料
