【发布时间】:2016-08-02 19:39:43
【问题描述】:
如何更改ImmutableList({}) 中位于Immutable.Map({}) 内的项目的属性?
我有:
const initialState = Immutable.Map({
width: window.board.width,
height: window.board.height,
lines: Immutable.List([
Immutable.Map({id: 1, active: false, name: 'Some name'}),
Immutable.Map({id: 2, active: false, name: 'Sad name'}),
Immutable.Map({id: 3, active: true, name: 'Cool name'})
])
});
假设我想在列表中设置带有id 1 的项目。然后将其属性 active 更改为 true。我还想将 List 中所有其他项目的属性 active 设置为 false。
我该怎么做?提前非常感谢。
编辑(最终解决方案):
export function activateLine(lineId) {
return function (dispatch, getState) {
const updatedLines = getState().board.update('lines', Immutable.List(),
(oldList) => oldList.map((listItem) => {
return listItem.set("active", (listItem.get("id") === lineId));
})).get('lines');
return dispatch({
type: types.ACTIVATE_LINE,
payload: updatedLines
});
};
}
【问题讨论】:
-
更改不可变对象是什么意思?关键是你不能;你必须复制和合并...
-
我想用新值返回新的不可变映射。
-
如何复制和合并它?你能给我举个例子吗?这正是我正在寻找的。span>
-
我不知道我对 javascript 有点陌生。我认为在 redux 中拥有不可变状态是一个好主意。不过这很痛苦,因为我对不可变 API 并不熟悉,这对于没有过程编程经验的人来说非常混乱。
-
是的,只需将整个对象包装在
immutable.fromJS({...your object})中,那么整个对象将是不可变的,您不必再细分每个部分。
标签: javascript reactjs immutability immutable.js