Javascript 如何在ReactJS中更新Reducer中的redux状态?
请知道我是ReactJS和Redux的新手 我有乘客名单,每个乘客都有航班名单。我想用action属性Javascript 如何在ReactJS中更新Reducer中的redux状态?,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,请知道我是ReactJS和Redux的新手 我有乘客名单,每个乘客都有航班名单。我想用action属性isCheckedIn更新flight属性,checkedIn。我如何在减速器中实现这一点 reducer.js export default function passengerReducer( state = initialState.passengers, action ) { switch (action.type) { case types.LOAD_PASSENG
isCheckedIn
更新flight属性,checkedIn
。我如何在减速器中实现这一点
reducer.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;
}
}
状态
包含对象数组。每个对象还包含航班
。目前,我只在flights
阵列中关注第一次飞行
该操作包含isCheckedIn
属性。我想用action中的isCheckedIn
属性更新flights
的checkedIn
属性
所以我想这是一段有问题的代码:
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)表示返回的数组中充满了未定义的
相反,您要做的是创建一个新数组,var newArray=state.slice(0)代码>
然后,找到要更改其checked_-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;
因此,您找到了要更改的项,对其进行了更改,将其放回数组中(我认为这是一种不变的操作方式),然后返回完整的数组嗨,您可以共享初始状态吗?我知道您看到许多人使用简单的一行函数链来处理数组,但您不必这样做。只要记住:从减速器返回的任何东西都将成为整个状态。因此,如果您返回一个过滤数组,那么在allIt works中,没有随过滤器返回的项目现在不是您整个状态的一部分。但是,我得到了以下错误Uncaught(in promise)不变量冲突:在调度内部的路径中检测到状态突变:
passengers.0.flights.0.seatNum。看看处理动作{“type”:“UPDATE_PASSENGER_SUCCESS”,“passengerData”:{“passengerId”:1,“seatNum”:“A1”,“isCheckedIn”:false}。
是的,所以即使我们复制了数组,复制了乘客,我们也没有复制航班。您可能想查看我使用过的某种“deepCopy”react软件包,并且没有错误newPassenger=JSON.parse(JSON.stringify(newArray[index])