如何在 redux 中深度更新 Immutable Js Map 中的两个值?
How to deep update two values inside Immutable Js Map in redux?
我正在尝试更新 items
-> yrgroih9
中的两个(width
& x
)值,如下所示:
{
appElements: {
layers: {
layer_1: {
background: {
width: '100px',
height: '100px',
bgColor: '#aaaaaa',
bgImage: 'http:bgimage1.png'
},
items: {
yrgroih9: {
width: '100px',
x: '200px',
y: '200px'
},
qhy0dukj: {
width: '100px',
x: '200px',
y: '200px'
},
'7lw2nvma': {
width: '100px',
x: '200px',
y: '200px'
}
}
}
}
}
}
用于更新内部新对象的代码 items
-> yrgroih9
:
case 'UPDATE_OBJECT':
return state.setIn(["appElements","layers","layer_1","items","yp57m359"],{
["width"]: action.objData.width,
["x"]: action.objData.x
});
以上代码删除当前位置 yrgroih9
内的 y
键并更新 width
和 x
值。
redux store 数据排列在setIn之后:(来自chrome redux devtools):
如何在不删除其他键值的情况下更新两个深度值。?
state.setIn 替换您指定路径中的整个对象 (appElements -> layers -> layer_1 -> items -> yp57m359)。您可以获取现有对象,修改字段,然后使用 setIn:
const oldObject =
state.hasIn(["appElements","layers","layer_1","items","yp57m359"])
? state.getIn(["appElements","layers","layer_1","items","yp57m359"])
: {};
const newObject = {
...oldObject,
width: action.objData.width,
x: action.objData.x
};
return state.setIn(["appElements","layers","layer_1","items","yp57m359"], newObject);
使用updateIn.
如果您的项目是 Immutable.js 地图的实例:
case 'UPDATE_OBJECT':
return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
(item) => item
.set('width', action.objData.width)
.set('x', action.objData.x)
);
如果您的项目是纯 JS 对象:
case 'UPDATE_OBJECT':
return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
(item) => ({
...item,
width: action.objData.width,
x: action.objData.x,
})
);
我正在尝试更新 items
-> yrgroih9
中的两个(width
& x
)值,如下所示:
{
appElements: {
layers: {
layer_1: {
background: {
width: '100px',
height: '100px',
bgColor: '#aaaaaa',
bgImage: 'http:bgimage1.png'
},
items: {
yrgroih9: {
width: '100px',
x: '200px',
y: '200px'
},
qhy0dukj: {
width: '100px',
x: '200px',
y: '200px'
},
'7lw2nvma': {
width: '100px',
x: '200px',
y: '200px'
}
}
}
}
}
}
用于更新内部新对象的代码 items
-> yrgroih9
:
case 'UPDATE_OBJECT':
return state.setIn(["appElements","layers","layer_1","items","yp57m359"],{
["width"]: action.objData.width,
["x"]: action.objData.x
});
以上代码删除当前位置 yrgroih9
内的 y
键并更新 width
和 x
值。
redux store 数据排列在setIn之后:(来自chrome redux devtools):
如何在不删除其他键值的情况下更新两个深度值。?
state.setIn 替换您指定路径中的整个对象 (appElements -> layers -> layer_1 -> items -> yp57m359)。您可以获取现有对象,修改字段,然后使用 setIn:
const oldObject =
state.hasIn(["appElements","layers","layer_1","items","yp57m359"])
? state.getIn(["appElements","layers","layer_1","items","yp57m359"])
: {};
const newObject = {
...oldObject,
width: action.objData.width,
x: action.objData.x
};
return state.setIn(["appElements","layers","layer_1","items","yp57m359"], newObject);
使用updateIn.
如果您的项目是 Immutable.js 地图的实例:
case 'UPDATE_OBJECT':
return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
(item) => item
.set('width', action.objData.width)
.set('x', action.objData.x)
);
如果您的项目是纯 JS 对象:
case 'UPDATE_OBJECT':
return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
(item) => ({
...item,
width: action.objData.width,
x: action.objData.x,
})
);