Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ReactJs-TypeError:无法分配给只读属性';名称';对象的'#&书信电报;对象>';_Reactjs_Typescript_React State Management - Fatal编程技术网

ReactJs-TypeError:无法分配给只读属性';名称';对象的'#&书信电报;对象>';

ReactJs-TypeError:无法分配给只读属性';名称';对象的'#&书信电报;对象>';,reactjs,typescript,react-state-management,Reactjs,Typescript,React State Management,我有一个对象数组: 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)=>{

我有一个对象数组:

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)

我认为这个错误意味着我不能直接改变状态,所以我必须复制。我认为通过
子类别
映射并将其推送到本地
newArr
意味着我复制了一个数组。但当我想更改其中object的值时,它不起作用,所以我使用object.assign,我认为它会从数组中深度复制特定对象,但它也不起作用


我在这里遗漏了什么?

正如评论中指出的:

  • 您发布的代码没有显示如何创建具有不可修改属性的对象
  • 您可以创建一个新对象,而不使用object.assign来消除错误
  • 以更惯用的方式使用
    map
    函数
接口标记{
名称:string,
标签:字符串
}
var子类别=[{名称:'手套',标签:'羊毛'},{名称:'靴子',标签:'皮革'}];
函数setSubcat(val:string,index:number,_lang:any){
var obj:部分={
“名称”:val
}
var newArr:TaggedItem[]=子类别.map((val,i)=>{
如果(索引==i){
返回{
…瓦尔,
…obj
} 
}否则{
返回{…val};
//或者返回val;如果不需要完整副本
}
})
控制台日志(newArr);
}
setSubcat('newName',0,未定义);

不可复制:同意;你能发布更多的代码或是一个游乐场的例子吗?此代码按原样很好。请不要那样使用
map
。每个人都会阅读这些代码,然后想“这是一个bug吗?我需要问他……”
map
用于转换每个元素,
forEach
用于访问每个元素。仍在使用
map
正确使用:@Lesiak就是它。谢谢你。我用地图的方式没用。这真是太好了,再次谢谢你。
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);