【问题标题】:How to replace set in immutableJs如何替换 immutableJs 中的集合
【发布时间】:2019-12-02 20:19:45
【问题描述】:

我有这些代码:

export function updated(list, el) {
  const id = list.findIndex(item => item.id === el.id);
  return id < 0 ? list.push(el) : list.set(id, el); // chiedere come
}

如何在没有 immutableJS 的情况下替换 list.set(id, el)

我试过了

list.id = el 

list = {
 el: id,
}

list[id] = el; 

所有这些都是错误的。

你能给我一个建议吗?

更新

根据@code-apprentice 的要求

我不需要函数的不同行为,我需要从一个大项目中删除不可变的。 现在与

list.id = el

list = {
 el: id,
}

带有 airbnb 配置的 esLint 说这是 no-return-assign for this line

如果我尝试list[id] = el,我会收到no-return-assign for this lineno-param-reassign for this line

【问题讨论】:

  • 对于您尝试过的每一件事,它们是如何“错误”的?发生了什么,您希望它做些什么不同的事情?
  • @Code-Apprentice 更新

标签: reactjs immutable.js


【解决方案1】:

这将以不可变的方式返回一个新对象。

 return id < 0 ? list.concat(el) : {...list, id: el}

注意事项

正如 Code-Apprentice 所观察到的,如果您的对象包含本身就是引用类型的子对象,那么您也应该传播,因为内部的引用将被维护

【讨论】:

  • 请注意,这是一个浅拷贝。如果list 包含对象或数组,则新对象仅具有对这些对象和数组的引用,而不是它们的副本。
  • push实际上是对原数组进行变异,concat会返回一个新数组
  • 是的,如果列表包含引用类型,那么您也应该传播。好点@Code-Apprentice
  • 即使你传播了孩子,那么他们的孩子呢?手动执行此操作是不可行的,因为嵌套通常可以任意深度。
  • 当然观察起来很有趣,但是在 React 中,孩子的不变性并不是那么有用,肯定会导致错误,但不太可能会给您带来问题,因为大多数时候比较会很肤浅
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多