Redux和Reducer中访问不同的reducer,如何?

问题描述:

所以,我有一个应用程序有多个减速器,并因此多个动作创建者相关联。Redux和Reducer中访问不同的reducer,如何?

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

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

长时间啰嗦我知道,我只是想解释我的情况。

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

这里的中间件是否适合我在哪里嗅探某个“action.type”,如果我看到它,我可以派发其他action.type或者有没有办法从productsReducer内部调用动作创建器?

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

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

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

因此,当用户选择sneakers,触发此动作

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

,然后在couponsReducer,有这样的事情:

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

你不想级联更新,其中状态取决于其他状态在改变。你想要一个简单的调度体系结构,其中一个动作同时影响所有内容。

+1

真棒。我主要关注的是保持在适当的范式内而不是反模式。我能够按照我的需要有效地完成我所需要的工作,就像您建议的那样。万分感谢。 –

+0

“基于应用程序状态更新状态是一种反模式”?这没有任何意义。 Reducer功能的重点在于您根据*当前状态*和行动来做出决定。 – markerikson

+0

@markerikson不,减压器是为了处理动作,而不是状态的变化。状态的变化应始终是行动的结果。创建操作作为被调度操作的结果是一种反模式。 –

在很多情况下,处理多个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