对 redux 缩减器中的数组进行多次更新
Multiple updates to an array in a redux reducer
我正在Redux存储上创建一个新操作。我有一个项目列表,这些项目都具有"overlayVis"的属性。我想将所有这些设置为 true,除了指定的 Id。 我目前的实现是
case ITEM_OVERLAY_TOGGLE:
// object to be updated and returned
var returnObj = state.data;
state.data.map((item) => {
if (item.id === action.id) {
returnObj = Object.assign({}, ...state, {
data: [
...state.data.slice(0, item.id),
Object.assign({}, ...state.data[item.id], {overlayVis: false}),
...state.data.slice(item.id + 1)]
});
} else if (!item.overlayVis) {
returnObj = Object.assign({}, ...state, {
data: [
...state.data.slice(0, item.id),
Object.assign({}, ...state.data[item.id], {overlayVis: true}),
...state.data.slice(item.id + 1)]
});
}
});
return returnObj;
每次迭代都会覆盖上一次迭代,因此每次运行操作时只进行一次更改。 我试图使用"状态"和"返回Obj"而不是"...状态",但它没有奏效。我已经很久没有在这里发帖了,但我没有想法了。
任何帮助将不胜感激!
我认为您的地图函数可以更改为如下所示。我只能从这里猜测,但你能看看这是否有效吗?
Map 函数用于转换数组中的对象,您需要在 map 函数中返回一个值才能进行转换。转换后的值存储在名为 newData 的新数组中。那是在外面返回的。
case ITEM_OVERLAY_TOGGLE:
var newData = state.data.map((item) => {
if (item.id === action.id) {
return {
...item,
overlayVis:false
}
} else {
return {
...item,
overlayVis : true
}
}
});
return {
...state,
data: newData
}
编辑:如果 action.id 也是数组的索引,请尝试此操作
case ITEM_OVERLAY_TOGGLE:
// object to be updated and returned
return {
...state,
data : [
...state.data.slice(0,action.id).map(i=>{ i.overlayVis = true, return i; }),
state.data[action.id].overlayVis=false,
...state.data.slice(action.id+1).map(i=>{ i.overlayVis = true, return i; })
]
};
相关文章:
- JavaScript-保存、存储和更新数组
- 使用ajax(刚刚更改的值)更新数组表
- 如何使用ajax和jquery动态更新数组表
- 使用条件for循环更新数组-Javascript
- 正在RactiveJS上更新数组
- 更新数组中的嵌入文档 - Mongodb + Node Driver
- 余烬更新数组中的对象
- 通过代码+敲除更新数组中的值
- 正在尝试获取事件之外的更新数组的值
- 更新数组后,ng重复双重渲染
- 使用angularjs中复选框的值更新数组
- 将变量推送到数组中,并在每次单击时更新数组
- 如何在Mongoose中从多个数组更新数组内部的值
- 在 ReactJS 中更新数组中对象的最佳方法是什么
- 在 Rally SDK 2 中,如何更新数组字段,例如在变更集的工件上
- 更新数组对象值
- MongoDB 用变量更新数组
- AngularJS - 使用 $http 更新数组内的嵌套对象属性
- JavaScript 使用索引更新数组元素
- 如何更新数组中的所有值?-JS/Jquery.