Redux和在一个减速器内访问不同的减速器,如何?

Redux和在一个减速器内访问不同的减速器,如何?,redux,react-redux,Redux,React Redux,因此,我有一个应用程序,它有多个简化程序,因此关联了多个动作创建者 有一段时间我的一个减速器会更新状态(因为编辑),因此,我必须确保其他减速器看到此更新并相应地调整其状态 将其视为用户选择“运动鞋”,这种状态管理在一个名为productsReducer的减速机中。因此,当用户在应用程序进程中移动时,他们会得到与之相关联的couponsReducer。。。但是用户可以随时“编辑”,因此如果他们编辑“运动鞋”并说,选择其他制作人,我必须能够实时更改couponsReducer,因为进度模式需要反映这

因此,我有一个应用程序,它有多个简化程序,因此关联了多个动作创建者

有一段时间我的一个减速器会更新状态(因为编辑),因此,我必须确保其他减速器看到此更新并相应地调整其状态

将其视为用户选择“运动鞋”,这种状态管理在一个名为productsReducer的减速机中。因此,当用户在应用程序进程中移动时,他们会得到与之相关联的couponsReducer。。。但是用户可以随时“编辑”,因此如果他们编辑“运动鞋”并说,选择其他制作人,我必须能够实时更改couponsReducer,因为进度模式需要反映这一点。我可以通过进入优惠券页面的流程来实现这一点,因为在该页面上,我只需核对componentWillMount上的数据。。。但问题是我有一个进度模式,在进入优惠券页面之前,用户可以打开进度模式。。。这里会有一场失利比赛

长篇大论我知道,我只是想解释一下我的处境

因此,我希望能够从productsReducer中调用“其他Reducer”或其动作创建者

中间件在这里是否合适,在这里我嗅探某个“action.type”,如果我看到它,我可以分派其他action.type,或者是否有方法从productsReducer中调用action创建者


导入:从“/couponsActions”导入*作为优惠券,以及我需要的任何其他操作似乎不合适。

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

如果一个操作影响多个减速器,请在关注的减速器中订阅该操作

因此,当用户选择
运动鞋
时,启动这些操作

{ type: 'item_select', payload: 'sneakers' }
然后在
couponsReducer
中,有如下内容:

function (state = initialState, action) {
  if (action.type == 'item_select') {
    return { ...state, activeProduct: action.payload);}
  }
  return state;
}
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中执行操作的方法)。所以一定要先尝试这个解决方案

在更复杂的情况下,可以使用一些库。例如,您可以使用以下方式处理:

function (state = initialState, action) {
  if (action.type == 'item_select') {
    return { ...state, activeProduct: action.payload);}
  }
  return state;
}
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
    }
}
也有其他库做同样的事情,但有点不同。他们中的大多数人都受到elm语言的启发:

此外,本报告还提供了有关上述图书馆思维的一些信息:


太棒了。我主要关心的是保持正确的模式,而不是反模式。我能够有效地做我需要的事情,就像你建议的那样,按我需要订阅。很好,谢谢。“根据应用程序的状态更新状态是一种反模式”?那没有任何意义。reducer函数的全部作用是根据当前状态和操作做出决策。@markerikson不,reducer是用来处理操作的,而不是状态的变化。状态的变化应始终是操作的结果。作为已调度操作的结果创建操作是一种反模式。似乎我们有一个术语不匹配。我想你们想说的是“在州里做基于差异的事情是个坏主意”?我仍然不同意你关于动作的陈述,特别是如果你使用中间件的话。分派一个操作,让中间件拦截它,并分派一个或多个其他操作作为响应是完全有效的。这就是中间件的作用。是的,我想我们在这种情况下说的是相同的。你是对的,我说错了动作——动作可以引发其他动作,反模式是多余的动作,或者是由还原程序触发的动作,或者是因为事后商店发生了变化。在你的应用程序中再添加一个库来解决你的问题不是一个解决方案。这是一个糟糕的设计,最初的库是Redux。