Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在ReactJS中更新Reducer中的redux状态?_Javascript_Reactjs_React Redux - Fatal编程技术网

Javascript 如何在ReactJS中更新Reducer中的redux状态?

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

请知道我是ReactJS和Redux的新手

我有乘客名单,每个乘客都有航班名单。我想用action属性
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])