Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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 在到达还原剂前检测到Redux A状态突变_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 在到达还原剂前检测到Redux A状态突变

Javascript 在到达还原剂前检测到Redux A状态突变,javascript,reactjs,redux,react-redux,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)}> 如您所见,我确实希望修改操作上的AppClass,因为我必须使用新修改的AppClass更新另一个reducer上的另一

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

 <div key={key} className='SDWanAppClassTreeItem' onClick={this.props.actions.handleToggleAppClass.bind(this,this.props.appClasses, 0, key)}>
如您所见,我确实希望修改操作上的AppClass,因为我必须使用新修改的AppClass更新另一个reducer上的另一个状态。在这里,我想修改appClasses状态(在一个reducer中),并通过在函数调用中调度修改后的appClasses到另一个操作dispatch(handleUpdateInitialSourceFetch(appClasses)); 我想修改另一个state selection.appClassesIds(在处理用户选择的另一个reducer中):

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

我要说的是,“切换应用程序类”的适当负载不是整个应用程序类列表,而是更接近于:

{ 
    type: types.TOGGLE_APP_CLASS, 
    payload: appClass.appClassId
}
状态修改应该在减速器中完成——这是明确的

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

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


在reducer中,您可以
切片
(如果这是一个数组),或者执行对象克隆以更新单个切换并将状态设置为该状态的新副本。但你不会直接改变状态;这样做会破坏Redux带来的很多东西(例如时间旅行)。

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


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

是否
appClasses
已处于该状态?也就是说,您是否直接改变状态?是的,这是我从中得到的状态。props.appclasses您不能直接改变状态;这是Redux的主要哲学之一。通常,这种转换不是通过在此处设置整个数组来表示的,而是通过传递ID及其新状态来表示的。在reducer中,你可以复制旧的状态并拼接到新的应用程序类状态。我知道,但我需要那个变量发送给动作的内容,它可以是一个副本或类似的东西,我从一篇文章中读到,有人做了类似const a=[…this.props.appClasses]的事情,但没有起作用。如何发送该变量的值?(出于格式原因,将注释移动到答案中。)(这或多或少是我在注释中所说的,但省略了注释中讨论切片/etc的部分,这是OP遇到的困难。)我希望操作中的appClasses可访问,以使用分派(handleUpdateInitialSourceFetch(appClasses))更新依赖于appClasses的另一个操作中的另一个状态;我是否应该将appClasses和selection.AppClassID合并到一个reducer中。因为他们彼此依赖。我可以发送appClass的id,但是在函数中有很多逻辑,我可以把所有的逻辑放在reducer中吗?正如你所看到的,我正在尝试修改appClass,因为我想用它来更新另一个状态“selection.appClassID”,它需要修改appClasses发送分派(handleUpdateInitialSourceFetch)(适用类别);也许我认为我必须在一个reducer中的一个大状态上有selection.AppClassID和appClassesId。另外,请注意修改是复杂的。我认为只有操作才能删除修改变量所需的代码量,然后将修改后的变量发送到reducer并更新状态。我用compl更新我的问题ete代码。我正在将应用程序从altjs转换为redux,所以我太迷茫了,我可以对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 };
}
{ 
    type: types.TOGGLE_APP_CLASS, 
    payload: appClass.appClassId
}