2016-08-03 13 views
14

我無法訪問保存的數據應用與redux-persist啓動後。默認值被載入前店與補充水份終極版 - 堅持

減速機使用在我的初始狀態中定義的數據進行初始化。在前一個會話的狀態使用AsyncStorage加載時,組件已經顯示了默認數據。

我知道數據已成功保存和提取。如果我離開屏幕到另一個屏幕並返回到屏幕,我可以看到數據顯示正確。調試狀態和道具也表明這是一個異步時間問題。

我怎樣才能延緩了Redux集裝箱的裝載到店裏再水化後。或者,我可以強制更新container(及其子項)以在商店完成加載時更新嗎?

這是我試過的。 配置我的商店:

export default function configureStore(initialState) { 
    const middlewares = [thunk]; 
    if (process.env.NODE_ENV === `development`) { 
     const createLogger = require(`redux-logger`); 
     const logger = createLogger(); 
     middlewares.push(logger); 
    } 

    let store = compose(
     applyMiddleware(...middlewares), 
     autoRehydrate())(createStore)(reducers); 

     persistStore(store, {blacklist: ['routing'], storage: AsyncStorage},() => { 
      store.dispatch(storeRehydrateComplete()) 
     }) 


    return store 
} 

希望這將更新所有其他組件(因爲在終極版所有減速被稱爲一個動作),我試圖創建當存儲加載完成後觸發一個動作:

import { REHYDRATE_STORE } from './types' 

export function storeRehydrateComplete(){ 
    return { 
     type: REHYDRATE_STORE, 
    } 
} 

而且它的減速機: 進口{} REHYDRATE_STORE從」 ../actions/types' 常數初始化狀態= { storeIsReady:假 }

export default function reducer(state = initialState, action){ 
    switch (action.type) { 
     case REHYDRATE_STORE: 
      return {...state, storeIsReady:true} 
      break; 
     default: 
      return state 
      break; 
    } 
} 

不過,儘管storeIsReady狀態更改爲真時補液完成後,我仍然無法弄清楚如何強制更新容器組件。

+1

如果使容器接收storeIsReady'mapStateToProps',它觸發componentWillReceiveProps?另外,沒有必要使用自己的動作類型,因爲你在redux-persist中有一個特殊的動作,''從'redux-persist /常量'導入{REHYDRATE};' –

回答

10

我解決它由以下這個配方: delay-render-until-rehydration-complete

基本上將溶液如下:
在一個包裝<Provider>組件,創建跟蹤商店是否已經重新水化但或者不是本地狀態標誌。使用persistStore()的回調來更新這個標誌。 在這個包裝的渲染函數中,如果該標記爲true,則呈現<Provider>,否則呈現一些臨時視圖。

+0

謝謝,它工作得很好! –

+1

無法訪問此文件的任何人:https://github.com/rt2zz/redux-persist/blob/558a3190f11f1a8a8024dc51ab6941382dfeed1d/docs/recipes.md –