在React的this.state中我有一个叫做的属性 formErrors
包含以下动态对象数组。
[
{fieldName: 'title', valid: false},
{fieldName: 'description', valid: true},
{fieldName: 'cityId', valid: false},
{fieldName: 'hostDescription', valid: false},
]
假设我需要更新具有fieldName的state对象 cityId
到有效值 true
。
解决这个问题的最简单或最常用的方法是什么?
我可以使用任何库 不变性辅助, 不可改变的js 等或ES6。我试过用谷歌搜索超过4个小时,仍然无法绕过它。非常感谢一些帮助。
您可以使用 map
迭代数据并检查fieldName,如果fieldName是cityId,那么你需要更改值和 返回一个新对象 否则只是 return
一样 object
。
写这样:
var data = [
{fieldName: 'title', valid: false},
{fieldName: 'description', valid: true},
{fieldName: 'cityId', valid: false},
{fieldName: 'hostDescription', valid: false},
]
var newData = data.map(el => {
if(el.fieldName == 'cityId')
return Object.assign({}, el, {valid:true})
return el
});
this.setState({ data: newData });
怎么样 不变性辅助?效果很好。你正在寻找 $merge
命令我想。
@FellowStranger:我的redux状态有一个(也是唯一一个)部分是一个对象数组。我使用reducer中的索引来更新正确的条目:
case EMIT_DATA_TYPE_SELECT_CHANGE:
return state.map( (sigmap, index) => {
if ( index !== action.payload.index ) {
return sigmap;
} else {
return update(sigmap, {$merge: {
data_type: action.payload.value
}})
}
})
坦率地说,这有点油腻,我打算改变我的状态对象的那部分,但它确实有用......听起来你并没有使用redux,但战术应该是相似的。
我强烈建议您不要将值存储在数组中,而是可以轻松指定要更新的元素。在下面的示例中,键是fieldName,但它可以是任何唯一标识符:
var fields = {
title: {
valid: false
},
description: {
valid: true
}
}
那么你可以使用immutability-helper's update
功能:
var newFields = update(fields, {title: {valid: {$set: true}}})