2017-04-07 93 views
0

我有一個異步reducer結構。在任何一個頁面,我注入的頁面與減速機:與反應路由器異步reducer似乎有多個商店?

export const injectReducer = (store, { key, reducer }) => { 
    // store.asyncReducers already initialized to {} 
    // makeRootReducer just returns combineReducers({...store.asyncReducers}) 

    store.asyncReducers[key] = reducer 
    store.replaceReducer(makeRootReducer(store.asyncReducers)) 
} 

我用react-router 3和平原路線定義任何給定的網頁上。我用require.ensure的路線的異步處理中平原路線定義的getComponent

export default (store) => ({ 
    path : 'counter', 
    getComponent (nextState, cb) { 
    require.ensure([], (require) => { 

     const Counter = require('./containers/Counter').default 
     const reducer = require('./modules/counter').default 

     injectReducer(store, { key: 'counter', reducer }) 

     cb(null, Counter) 

    }, 'Counter') 
    } 
}) 

我的問題是,如果我使用dispatch其次browserHistory.push,我希望,國家得到纔去到新的頁面更新。然而,會發生什麼呢,似乎有2個獨立的商店。例如,在頁面之間導航時,儘管前一頁的計數器位於同一個鍵上,但它的值似乎仍然保留。這裏發生了什麼???

樣本repo我的問題。你可以git clone,npm install,npm start並去localhost:3000/counter。如果您點擊Double (Async),它會將計數器加倍,然後進入/otherPage。如果您再點擊Half (Async)它會將您帶回/counter。然而,計數器的值是從doubling的值,而不是從halving。另外,重要的是,拉起Redux DevTools並在頁面之間導航似乎顯示之前所有數據的計數器更改。幾乎好像整個商店被替換了,但是先前的價值被保留了下來。

這是怎麼回事?

回答

0

經過大量調查後,我發現ReduxDevTools將在開發過程中重新計算整個狀態歷史記錄。在新頁面上的initialState不同的位置插入一個新的縮減器會導致2個不同的結果。沒有2個商店或任何緩存,它只是使用不同的initialStates重新計算整個狀態歷史記錄的redux dev工具。

因此,在我的情況下,調度正在更新我的第一頁上的狀態。然後browserHistory推進到第二頁。第二頁重新計算整個狀態歷史。但是第二頁有一個簡化器,它缺少第一頁的動作處理器。因此,當重新計算整個狀態歷史時,狀態不會從最後一個操作改變。