Redux 商店的一部分依赖于其他部分

Redux 商店的一部分依赖于其他部分,redux,Redux,作为一个场景,用户可以单击一个按钮来创建一个时间戳列表,该列表显示进行单击时的相应时间。用户还可以单击列表中的项目以删除项目 在存储方面,有一个计数器状态跟踪按钮被单击的次数,还有一个状态跟踪时间戳列表。列表状态中的每个项都有一个从计数器状态派生的id字段。因此,商店的一部分依赖于另一部分 作为一种尝试,我分派一个动作,两个减速机处理相同的动作,它工作正常,但只是它不干燥。在分派之前,我必须将1添加到计数器状态,以便获得用作操作有效负载的新id,分派之后,我再次将1添加到计数器状态以返回新的计数

作为一个场景,用户可以单击一个按钮来创建一个时间戳列表,该列表显示进行单击时的相应时间。用户还可以单击列表中的项目以删除项目

在存储方面,有一个计数器状态跟踪按钮被单击的次数,还有一个状态跟踪时间戳列表。列表状态中的每个项都有一个从计数器状态派生的id字段。因此,商店的一部分依赖于另一部分

作为一种尝试,我分派一个动作,两个减速机处理相同的动作,它工作正常,但只是它不干燥。在分派之前,我必须将1添加到计数器状态,以便获得用作操作有效负载的新id,分派之后,我再次将1添加到计数器状态以返回新的计数器状态。那是在重复我自己


处理此类问题的一般标准方法是什么

一般的简单方法是使用thunks。您需要设置中间件,请查看以下文档:

这允许您分派函数,而不是简单的操作。在该函数中,您可以根据需要多次访问状态和调度

在您的场景中,您将首先递增计数器,然后检索长度以获取新id,然后分派另一个操作以创建时间戳

你的动作创造者的一些想象代码:

// basic action creators to be handled in your reducers
function incrementCounter(){
   return { type: 'INCREMENT'}
}
function createTimestamp(id){
   return { type: 'CREATE_TS', id }
}
// this is the thunk
function incrementAndTimestamp(){
   return (dispatch, getState) => {
     // increment the counter
     dispatch(incrementCounter())
     // generate an "id" from the resulting state
     const newId = getState().counter.length
     // and use that id to further update your state
     dispatch(createTimestamp(newId))
   }
}

您将需要在减缩器中处理这两个不同的操作,现在您有了两段独立的代码。thunk是一种胶水,用于分派、从一个部分获取数据,并使用它影响另一部分。

这与不使用thunk而从组件分派两个动作有什么不同?当然,区别在于封装:组件不需要知道当它想做自己的事情时在引擎盖下发生了什么。隔离测试组件和动作创建者更容易。这是您问题的一般解决方案,但不同的场景可能需要在这里或那里稍作调整。:)