2016-08-03 32 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 –