我想修改之前的狀態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包中,因此應該以某種方式「鏈接」。因此,減速器正在檢測有效載荷內是否存在路徑和對象,並試圖從中減少新狀態。
最糟糕的解決方案是指示用戶在減速器內的任何其他動作之前,從其自己的減速器調用減速器。這不是一個堅實的模式。所以起初,我在儘可能不知道中間件的情況下自動完成這項工作。這就是爲什麼我想盡可能從中間件修改狀態的原因。
謝謝,我面臨的情況是,我正在構建一個將一個action對象('payload')和一個路徑('action.meta')映射到'immutable-js''狀態'的包。在這種情況下,減速器分佈在一個包中,所以它應該以某種方式「鏈接」。起初我以爲我在儘可能不知道中間件。所以這就是爲什麼我想盡可能從中間件修改狀態的原因。 – Miquel
啊,好的。簡單地從中間件發出一個動作是否有意義?你的軟件包用戶必須將你的軟件包的reducer添加到他們的combineReducers()中,但這對修改狀態的軟件包來說是正常的。還是我誤解你的目標? –
你是對的,這不是目標。如果用戶添加包縮減器,它將無法修改整個縮減器,這是爲了:在用戶繼續執行其操作之前構造一個幫助器函數,該函數修改用戶狀態。會是一種'express node.js'中間件,在下一個中間件/用戶函數之前解析參數。 – Miquel