javascript - 如何在 ReactJS 的 Reducer 中更新 redux 状态?
问题描述
请知道我是 Redux 的 ReactJS 新手。
我有乘客名单,每个乘客都有航班清单。我想checkedIn
用 action 属性更新 flight 属性isCheckedIn
。我怎样才能在减速器中实现这一点?
减速器.js
export default function passengerReducer(
state = initialState.passengers,
action
) {
switch (action.type) {
case types.LOAD_PASSENGERS_SUCCESS:
return action.passengers;
case types.UPDATE_PASSENGER_SUCCESS:
console.log("action ", action.passengerData.passengerId);
console.log("state ", state);
return state
.filter(x => x.id == action.passengerData.passengerId)
.map(f => {
f.flights[0].checkedIn = action.passengerData.isCheckedIn
});
default:
return state;
}
}
state
包含对象数组。每个对象还包含flights
. 目前,我只关注flights
阵列中的第一次飞行。
动作包含isCheckedIn
属性。我想从操作中更新with属性checkedIn
的属性。flights
isCheckedIn
解决方案
所以这是我认为有问题的代码:
case types.UPDATE_PASSENGER_SUCCESS:
console.log("action ", action.passengerData.passengerId);
console.log("state ", state);
return state
.filter(x => x.id == action.passengerData.passengerId)
.map(f => {
f.flights[0].checkedIn = action.passengerData.isCheckedIn
});
您正在 (a) 仅针对要更改的元素过滤数组,以及 (b) 映射但不从 map 函数返回任何内容
仅 (a) 单独是不好的——您要更改整个状态以仅包含过滤后的项目?我不认为那是你的本意。但是然后 (b) 意味着您要返回一个完整的数组undefined
相反,您想要做的是创建一个新数组,var newArray = state.slice(0);
然后,找到要更改其 check_in 属性的项目的索引,
var index = newArray.findIndex(x => x.id == action.passengerData.passengerId);
var newPassenger = Object.assign({}, newArray[index]);
newPassenger.flights[0].checkedIn = action.passengerData.isCheckedIn;
newArray[index] = newPassenger;
return newArray;
所以你找到了你想改变的项目,改变它,把它放回数组中(我认为这是不可变的做事方式),然后返回完整数组
推荐阅读
- gcc - 链接 Ocaml 和 C 时未解析的外部函数
- laravel - 有没有办法在 Laravel 查询构建器中通过两个连接的数据透视表来 hasManyThrough?
- apache-calcite - Apache Calcite 到 Elasticsearch 连接的映射示例
- hadoop - 无法关闭文件,因为最后一个块没有足够数量的副本。
- php - 如何验证 mimes 文件 laravel
- bash - Rclone Mount 为 Mac 命令添加非中断空间
- python - 仅在 x 后面有数字时才替换
- python - 我无法从 pycharm 包安装程序安装 cv2
- c++ - 如何对 C++ 概念进行类型擦除
- opencv - 如何设置图像的分辨率