Redux在到达减速器之前检测到状态突变

时间:2017-01-26 14:24:40

标签: javascript reactjs redux react-redux

我从视图发送到一个动作this.props.appClasses 这是观点:

 <div key={key} className='SDWanAppClassTreeItem' onClick={this.props.actions.handleToggleAppClass.bind(this,this.props.appClasses, 0, key)}>

在我修改从视图中获取的appClasses的操作中,我想将修改后的appClasses发送到reducer以更新appClasses状态。但它在到达减速器之前给了我一个错误。

  

检测到状态突变   这是行动:

export function handleToggleAppClass(appClasses, parentAppClassId, appClassId) {
  // console.log('handleToggleAppClass', appClassId, this.appClasses[appClassId]);

  if (appClass.parentAppClassId == 0) {
    // Flip the appClass Show Property
    appClasses[appClass.appClassId].show = appClasses[appClass.appClassId].show ? false : true;

    if (Object.keys(appClasses[appClass.appClassId].children).length !== 0) {
      // Regardless if we enable or disabled the parent, all children should be disabled
      for (var childKey in appClasses[appClass.appClassId].children) {
        appClasses[appClass.appClassId].children[childKey].show = false;
      }
    }
  } else {
    // If we are enabling a child, make sure parent is disabled
    if (!appClasses[appClass.parentAppClassId].children[appClass.appClassId].show) {
      appClasses[appClass.parentAppClassId].show = false;
    }
    appClasses[appClass.parentAppClassId].children[appClass.appClassId].show = appClasses[appClass.parentAppClassId].children[appClass.appClassId].show ? false : true;
  }

  dispatch(handleUpdateInitialSourceFetch(appClasses));

  return { type: types.TOGGLE_APP_CLASS, appClasses };
}

正如您所看到的,我确实想修改操作上的appClasses,因为我必须使用新修改的appClasses来更新另一个reducer上的另一个状态。在这里,我想修改appClasses状态(在一个reducer中),并在函数调用中调度修改后的appClasses on other action dispatch(handleUpdateInitialSourceFetch(appClasses)); 我想修改另一个状态selection.appClassesIds(在另一个处理用户选择的reducer中):

const selection = {
  timespan: "-3660",
  direction: 0,
  appClassIds: []
};


export function updateAppClassesIds(appClasses) {
  var appClassIds = [];
  for (var key in appClasses) {
    if (appClasses[key].show) appClassIds.push(key);
    if (Object.keys(appClasses[key].children).length !== 0) {
      // Regardless if we enable or disabled the parent, all children should be disabled
      for (var childKey in appClasses[key].children) {
        if (appClasses[key].children[childKey].show) appClassIds.push(childKey);
      }
    }
  }

  return { type: types.UPDATE_APP_CLASSES_IDS, appClassIds };
}

如何将appClasses变量从视图发送到操作而不会出现该错误。 或者我应该将选择和appClasses状态放在一个大状态,以便能够访问这两个状态,因为它们相互依赖?

2 个答案:

答案 0 :(得分:1)

您可以通过创建一个接收要修改的appClass的ID和新值(true / false)的操作来实现此目的。

然后,您的reducer应该能够处理您所在状态的更新,然后通过订阅的组件进行传播。

答案 1 :(得分:0)

我所说的是“切换应用类”的适当有效负载并不是应用类的完整列表,而是接近以下内容:

slice

状态修改应该在reducer中完成 - 明确地what reducers are for

  

reducer是一个纯函数,它接受前一个状态和一个动作,并返回下一个状态。

您尝试(a)直接在动作创建者中修改状态,以及(b)尝试在错误的位置修改状态。一旦你开始在正确的地方做事,解决这个问题要容易得多。

在你的reducer中你要么<meta http-equiv="Content-Type" content="text/html; charset=GBK" /> (如果这是一个数组),要么做一个对象克隆来更新单个切换并将状态设置为这个新的状态副本。但你直接改变状态;这样做会破坏Redux带来的很多东西(例如时间旅行)。