[英]Cannot assign to read only property 'property' of object '#<Object>'
我有這個問題。
帶接口:
export interface IDevice {
id: string,
selected: boolean
}
通過以下方式創建實例:
let newDevice: IDevice = {
id: uuid4(),
selected: false,
} as IDevice;
它被添加到 recoil state 中的數組中,並在 React 中用於 function 中,其中數組已使用 useRecoilState() 檢索。 const [leftList, setLeftList] = React.useState<IDevice[]>([]);
現在它在處理程序中用於選擇列表控件上的設備,這里發生錯誤:
...
leftList.map((item: IDevice) => {
if (item.id === event.dataItem.id) {
item.selected = !item.selected;
}
return item;
})
...
我收到錯誤消息:無法分配給 object '#' 的只讀屬性 'selected'
即使首先通過 [...leftList] 克隆數組也無濟於事。
我迷路了:-)希望有人能對此有所了解嗎?
State 不應該直接修改,這是您現在通過更新對象在.map()
方法中所做的。 TS 試圖通過將對象設置為只讀來告訴您不要這樣做。
相反,您可以創建一個新的 object ,其中包含item
的所有屬性(使用擴展語法完成... ),以及一個新的覆蓋屬性selected
,如果 id 與事件的數據項 ID,否則將保留原始選定值:
leftList.map((item: IDevice) => ({
...item,
selected: item.id === event.dataItem.id ? !item.selected : item.selected
}))
使用擴展語法( [...leftList]
)克隆數組只會進行淺拷貝,不會對其中的對象進行深拷貝,因此會修改.map()
中的 object 引用還在修改原來的state。
或者,不是每次都傳播item
object 並創建一個新的 object (這可能會稍微影響性能,正如@3limin4t0r所指出的那樣),您可以只返回一個新創建的 ZA8CFDE6331BD59EB2AC96F8911C4B 時修改selected
的屬性:
leftList.map((item: IDevice) => {
if (item.id !== event.dataItem.id) return item;
return {...item, selected: !item.selected};
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.