ReactJs - TypeError: Cannot assign to read only property 'name' of object '#<Object>'
ReactJs - TypeError: Cannot assign to read only property 'name' of object '#<Object>'
我有一个对象数组:
var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}]
我只想找到要更改名称或标签的对象的索引。我使用这个功能:
function setSubcat(val, index, lang){
var newArr = []
var obj = {
'name': val
}
subcategories.map((val, i)=>{
if(index === i){
var newObj = Object.assign(val, obj)
newArr.push(newObj)
}
newArr.push(val)
})
setSubcategories(newArr)
}
错误发生在 var newObj = Object.assign(val, obj)
我认为这个错误意味着我不能直接改变状态,所以我必须复制一份。我认为通过 subcategories
映射并将其推送到本地 newArr
意味着我制作了数组的副本。但是当我想更改其中的对象值时它不起作用,所以我使用 Object.assign 我认为它会从数组中深度复制特定对象,但它也不起作用。
我在这里错过了什么?
正如评论中指出的那样:
- 您发布的代码没有显示您如何创建具有不可修改的对象属性
- 您可以创建一个新对象而不使用 Object.assign 来消除错误
- 以更惯用的方式使用
map
函数
interface TaggedItem {
name: string,
tag: string
}
var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}];
function setSubcat(val: string, index: number, _lang: any){
var obj: Partial<TaggedItem> = {
'name': val
}
var newArr: TaggedItem[] = subcategories.map((val, i)=>{
if(index === i){
return {
...val,
...obj
}
} else {
return {...val};
// or return val; if you don't need a full copy
}
})
console.log(newArr);
}
setSubcat('newName', 0, undefined);
我有一个对象数组:
var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}]
我只想找到要更改名称或标签的对象的索引。我使用这个功能:
function setSubcat(val, index, lang){
var newArr = []
var obj = {
'name': val
}
subcategories.map((val, i)=>{
if(index === i){
var newObj = Object.assign(val, obj)
newArr.push(newObj)
}
newArr.push(val)
})
setSubcategories(newArr)
}
错误发生在 var newObj = Object.assign(val, obj)
我认为这个错误意味着我不能直接改变状态,所以我必须复制一份。我认为通过 subcategories
映射并将其推送到本地 newArr
意味着我制作了数组的副本。但是当我想更改其中的对象值时它不起作用,所以我使用 Object.assign 我认为它会从数组中深度复制特定对象,但它也不起作用。
我在这里错过了什么?
正如评论中指出的那样:
- 您发布的代码没有显示您如何创建具有不可修改的对象属性
- 您可以创建一个新对象而不使用 Object.assign 来消除错误
- 以更惯用的方式使用
map
函数
interface TaggedItem {
name: string,
tag: string
}
var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}];
function setSubcat(val: string, index: number, _lang: any){
var obj: Partial<TaggedItem> = {
'name': val
}
var newArr: TaggedItem[] = subcategories.map((val, i)=>{
if(index === i){
return {
...val,
...obj
}
} else {
return {...val};
// or return val; if you don't need a full copy
}
})
console.log(newArr);
}
setSubcat('newName', 0, undefined);