在将Immutable.js与嵌套的地图和列表一起使用时,我遇到了问题,我期望mergeIn
会将新值与旧值合并,但是它将覆盖该值。
如何正确获取它?
const state = fromJS({
list: []
})
.update("list", l => l.push({ a: 1 }))
.mergeIn(["list", 0], { b: 3 })
.getIn(["list", 0])
我期望最终值为{ a: 1, b: 3 }
,但是实际输出为{ b: 3 }
答案 0 :(得分:0)
Immutable.js不应合并这样的普通对象(无论如何在v4之前)。
state.mergeIn(["list", 0], { b: 3 })
等效于
state.updateIn(["list", 0], m => m.merge({ b: 3 }))
调用.updateIn()
的更新程序功能时,由于{ a : 1}
的原型中没有merge()
方法,因此Immutable.js不会合并它,而是替换为新对象。
如果仅使用{a : 1}
制作Immutable.Map,则可以解决此问题。或使用Immutable.js v4 +:显然,它使用Immutable.merge()
合并纯对象,完全符合您期望的方式。
答案 1 :(得分:0)
我使用immutableJS v4.0.0-rc.12进行了测试,它可以按您的预期运行,即{ a: 1, b: 3 }
。所以也许您只需要更新到该版本