2016-05-13 17 views
1

我想修改之前的狀態next()被調用,所以每個reducer應用後中間件獲得新的狀態。 這可能嗎?怎麼樣?Redux中間件改變狀態在下一個之前()

這使我心中唯一的想法是非常哈克,並會是這樣的:

export const myMiddleware = (store) => (next) => (action) => { 
    const oldReducer = ???? 
    store.replaceReducer(myReducer); 
    store.dispatch(action); 
    const newState = store.getState(); 
    store.replaceReducer(oldReducer); 
    return next(newState); 
} 

由於我沒有看到任何方法來獲得當前的減速,應該給予中間件以任何方式:

export const myMiddleware = (oldReducer) => (store) => (next) => (action) => { 
    ... 
} 

const store = createStore(originalReducer, applyMiddleware(myMiddleware(originalReducer))); 

這似乎更加hacky!

主要目的是構建一個程序包,該程序包在店鋪state中映射操作對象(action.payload)和路徑(action.meta)。在這種情況下,reducer分佈在一個npm包中,因此應該以某種方式「鏈接」。因此,減速器正在檢測有效載荷內是否存在路徑和對象,並試圖從中減少新狀態。

最糟糕的解決方案是指示用戶在減速器內的任何其他動作之前,從其自己的減速器調用減速器。這不是一個堅實的模式。所以起初,我在儘可能不知道中間件的情況下自動完成這項工作。這就是爲什麼我想盡可能從中間件修改狀態的原因。

回答

0

您可能不希望從中間件內部調用個別減速器。這聽起來像是你應該將多個順序操作集中到一個單一的操作中,這是什麼導致你的問題。如果您使用類似redux-saga的東西來管理操作鏈,則可能很容易地完成要查找的內容。

這裏的管理與終極版,傳奇動作序列的一個基本的例子:

import { takeEvery } from 'redux-saga' 
import { put } from 'redux-saga/effects' 

export function * watchForSomeAction() { 
    // Every time SOME_ACTION is dispatched, doSomethingElse() will be called 
    // with the action as its argument 
    yield * takeEvery('SOME_ACTION', doSomethingElse) 
} 

export function * doSomethingElse (action) { 
    // put() is redux-saga's way of dispatching actions 
    yield put({ type: 'ANOTHER_ACTION', payload: action.payload }) 
} 

這個例子簡單手錶SOME_ACTION,並且當它發生時,將分派ANOTHER_ACTION。通過這樣的事情,你可以確保ANOTHER_ACTION的減速器正在處理由SOME_ACTION的減速器產生的新狀態。

+0

謝謝,我面臨的情況是,我正在構建一個將一個action對象('payload')和一個路徑('action.meta')映射到'immutable-js''狀態'的包。在這種情況下,減速器分佈在一個包中,所以它應該以某種方式「鏈接」。起初我以爲我在儘可能不知道中間件。所以這就是爲什麼我想盡可能從中間件修改狀態的原因。 – Miquel

+0

啊,好的。簡單地從中間件發出一個動作是否有意義?你的軟件包用戶必須將你的軟件包的reducer添加到他們的combineReducers()中,但這對修改狀態的軟件包來說是正常的。還是我誤解你的目標? –

+0

你是對的,這不是目標。如果用戶添加包縮減器,它將無法修改整個縮減器,這是爲了:在用戶繼續執行其操作之前構造一個幫助器函數,該函數修改用戶狀態。會是一種'express node.js'中間件,在下一個中間件/用戶函數之前解析參數。 – Miquel

相關問題