Redux和减速器内的一个访问不同的减速器,怎么样?

时间:2016-03-07 19:03:00

标签: redux react-redux

所以,我有一个应用程序,它有多个reducer,因此有多个动作创建者关联。

有一段时间我的一个Reducer更新了状态(因为编辑),因此,我必须确保其他reducers看到此更新并相应地调整它们的状态。

将其视为用户选择“运动鞋”,并且此状态管理位于名为productsReducer的缩减器中。因此,当用户通过应用程序进程移动时,他们会获得与之关联的优惠券Rededcer ...但是用户可以随时“编辑”,所以如果他们然后编辑“运动鞋”并说,选择另一个制作人,我必须能够实时更改优惠券减少器,因为进度模式需要反映这一点。我可以通过流程到优惠券页面来做到这一点,因为在那个页面上我只是调和了componentWillMount上的数据......但是我有一个进度模式,在进入优惠券页面之前,用户可以打开进度模式......这里会出现一个错配...

我知道,我只是想解释一下我的情况。

所以,我希望能够在productsReducer中调用“其他reducer”或他们的动作创建者。

中间件在这里是否合适,我会嗅到某个“action.type”,如果我看到它,我可以发送其他action.type's或者有没有办法从productsReducer中调用动作创建者? / p>

导入:导入*作为来自'./couponsActions'的优惠券以及我需要的任何其他操作似乎都不合适。

2 个答案:

答案 0 :(得分:20)

根据应用程序状态更新状态是一种反模式。解决方案更简单:

如果某个操作影响多个Reducer,请在关注的reducers中订阅该操作。

因此,当用户选择sneakers时,请触发这些操作

{ type: 'item_select', payload: 'sneakers' }

然后在couponsReducer中,有类似的内容:

function (state = initialState, action) {
  if (action.type == 'item_select') {
    return { ...state, activeProduct: action.payload);}
  }
  return state;
}

您不希望级联更新,其中状态取决于其他状态的变化。您需要一个简单的调度架构,其中一个操作同时影响所有内容。

答案 1 :(得分:1)

在许多情况下,在多个reducer中处理相同的操作就足够了(这是官方推荐的redux中的处理方式)。所以总是首先尝试该解决方案。

在更复杂的情况下,您可以使用一些库。例如,使用redux-saga,您可以像这样处理它:

function* watchItemSelect() {
    while(true) {
        // Wait for the action you are interested in
        const action = yield take('ITEM_SELECT');
        // Send another action
        yield put({type: 'OTHER_ACTION'}) 
        // The loop will now continue and wait until the next ITEM_SELECT action comes
    }
}

还有其他库可以做同样的事情,但有点不同。他们中的大多数都受到榆树语言的启发:

此回购中还有一些关于上述库中思路的信息:

redux-architecture