无法使用 .map() 分配给只读属性。使用 NextJs 反冲

Posted

技术标签:

【中文标题】无法使用 .map() 分配给只读属性。使用 NextJs 反冲【英文标题】:Cannot assign to read only property with .map(). Recoil with NextJs 【发布时间】:2021-07-16 10:00:04 【问题描述】:

在我只使用 nextJs 之前一切都很好,但是在我尝试使用 recoil 并尝试使用 .map() 为数组对象分配新值但出现错误

Cannot assign to read only property 

这是我的示例数组对象

  const [allData, setAllData] = useRecoilState(
    allDataStatte
  );

这里是示例状态 AllData

const allData = [ 编号:1, 值:“test1” , 编号:2, 值:“test2” ]

这是我的代码

const edit = (listId, value) => 
  allData.map((data) => 
    if (data.id === listId) 
      data.value = value;
    
  );
;

我想像这样调用编辑函数的例子

edit(1,"newTitle1")

我希望我的新 allData 输出看起来像这样

const data = [
  
    id:1,
    value:"newTitle1"
  ,
  
    id:2,
    value:"test2"
  
]

我读到有人告诉我必须使用 .slice() 来创建新对象,但仍然没有使用如何将 slice 与数组对象一起使用

【问题讨论】:

我不使用 Recoil,但您不应该尝试直接修改这样的状态对象(显然它会主动阻止,这很方便。)另外,map is not for just looping。您可能确实需要map,但与上面不同的是,您实际上希望使用它的返回值。 (“可能”因为我不使用 Recoil。) 【参考方案1】:

这是你需要做的,

const [allData, setAllData] = useRecoilState(allDataState);

const edit = (listId : number, value : string) => 
  let newAllData = allData.map((data) => 
    let newData = ...data;
    if (data.id === listId) 
      newData.value = value;
    
    return newData;
  );
  setAllData (newAllData);
;
edit(1, 'new value 1');

注意,newAllData 是一个新数组。 newData 也是一个由数据构造的新对象。

【讨论】:

【参考方案2】:

这是因为 atom in recoil 必须重新创建对象数组,然后使用 _clondeep 或 slice 再次 setState

【讨论】:

以上是关于无法使用 .map() 分配给只读属性。使用 NextJs 反冲的主要内容,如果未能解决你的问题,请参考以下文章

无法分配给对象“#<ValidationComponent>”的只读属性“dataChange”

无法分配给对象的只读属性

TypeError:无法分配给只读属性 - Karma

Vue导入导致无法分配给对象错误的只读属性'exports'

尝试在 React 中使用“Socket.io-client”模块会引发错误:无法分配给对象“#<Object>”的只读属性“exports”

无法分配给对象的只读属性“stopImmediatePropagation”