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

时间:2017-07-04 10:04:33

标签: redux

作为一种场景,用户可以单击按钮创建时间戳列表,以显示点击发生时的相应时间。用户还可以单击列表中的项目以删除项目。

就商店而言,有一个计数器状态,用于跟踪按钮被点击的次数,然后是另一个跟踪时间戳列表的状态。列表状态中的每个项目都有一个从计数器状态派生的id字段。所以商店的一部分取决于另一部分。

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

处理这种问题的一般标准方法是什么?

1 个答案:

答案 0 :(得分:1)

一般简单的方法是使用thunk。您需要设置中间件,请查看文档: https://github.com/gaearon/redux-thunk

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

在您的方案中,您首先递增计数器,然后检索长度以获取新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))
   }
}

您需要在Reducer中处理这两个不同的操作,现在您有两个独立的代码片段。 thunk是调度的胶水,从一个部分获取数据,并使用它来影响另一个部分。