Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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 减速器的复杂状态修正_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 减速器的复杂状态修正

Javascript 减速器的复杂状态修正,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中的状态。我想这样做,因为我读到减缩器应该是简单的,并且你可以在操作中看到的修改是复杂的。我可以在减速器中进行这种复杂的修改吗?因为这里给了我一个错误,因为我正在发送this.props.appClasses。如果在reducer上执行此操作,则不必发送AppClass,因为它处于reducer的状态


因此,在一行中,我可以在一个减速机上进行复杂的修改,而不是在动作上进行修改吗?

您可以创建一个函数来计算新的appClasses状态,并在每个动作中发送两个动作来发送这个新状态。 然后使用redux thunk中间件分派此函数本身

它将如下所示:

function handleSomeUserInteraction(appClasses, parentAppClassId, appClassId) {

  return function(dispatch) {

    //make a copy of appClasses, so you wont change the state directly
    let newAppClasses = Object.assign({}, appClasses)        

    //do all logic work to compute new appClasses
    //...
    //...

    //handleUpdateInitialSourceFetch
    dispatch({ type: types.UPDATE_INITIAL_SOURCE_FETCH, appClasses: newAppClasses }

    //handleToggleAppClass
    dispatch({ type: types.TOGGLE_APP_CLASS, appClasses: newAppClasses })    

  }
}
您可以在此处了解更多信息:

答案与之前相同——您不能直接修改状态。无论您是在传递已更改的状态还是在reducer中更改它,您仍然需要使用克隆/切片/任何机制。如果我在reducer上更改它,我就不必发送AppClass,因为我在状态上有它。我将只发送parentAppClassId、appClassId,并用它修改状态。我的问题是:将所有代码放在减速机上是一种好的做法?是的——这就是减速机的用途,在给定一组参数的情况下改变状态。动作创造者正是为了创造动作。功能实际存在的位置是一个单独的问题;它可以是从reducer调用的独立函数(易于测试);我需要找到一种基于另一个状态更新一个状态的方法。请看一看
function handleSomeUserInteraction(appClasses, parentAppClassId, appClassId) {

  return function(dispatch) {

    //make a copy of appClasses, so you wont change the state directly
    let newAppClasses = Object.assign({}, appClasses)        

    //do all logic work to compute new appClasses
    //...
    //...

    //handleUpdateInitialSourceFetch
    dispatch({ type: types.UPDATE_INITIAL_SOURCE_FETCH, appClasses: newAppClasses }

    //handleToggleAppClass
    dispatch({ type: types.TOGGLE_APP_CLASS, appClasses: newAppClasses })    

  }
}