在使用 redux-persist 重新水化存储之前加载初始状态的默认值

Posted

技术标签:

【中文标题】在使用 redux-persist 重新水化存储之前加载初始状态的默认值【英文标题】:default values from initial state are loaded before store rehydrates with redux-persist 【发布时间】:2016-12-09 09:08:36 【问题描述】:

应用以redux-persist 启动后,我无法访问已保存的数据。

reducer 使用在我的初始状态中定义的数据进行初始化。当上一个会话的状态使用 AsyncStorage 加载时,组件已经显示为默认数据。

我知道数据已成功保存和提取。如果我离开屏幕到另一个屏幕并返回它,我可以看到数据显示正确。调试 state 和 props 也表明这是一个异步计时问题。

如何将 redux 容器的加载延迟到 store 补水后。或者,我可以在商店加载完成时强制更新容器(及其子容器)吗?

这是我尝试过的。 配置我的商店:

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

希望这会更新所有其他组件(因为 redux 中的所有减速器都在一个操作中调用),我尝试创建一个在商店加载完成时触发的操作:

import  REHYDRATE_STORE  from './types'

export function storeRehydrateComplete()
    return 
        type: REHYDRATE_STORE,
    

它是减速器: 从“../actions/types”导入 REHYDRATE_STORE 常量初始状态 = storeIsReady: 假

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

虽然当补液完成时 storeIsReady 状态变为 true,但我仍然不知道如何强制更新容器组件。

【问题讨论】:

如果让容器接收storeIsReadymapStateToProps,会触发componentWillReceiveProps吗?另外,不需要你自己的动作类型,因为你在 redux-persist 中有一个特殊的动作,import REHYDRATE from 'redux-persist/constants'; 【参考方案1】:

我按照这个食谱解决了这个问题: delay-render-until-rehydration-complete

基本上解决方法如下: 在包装 <Provider> 的组件中,创建一个本地状态标志,用于跟踪商店是否已重新水化。使用 persistStore() 的回调来更新这个标志。 在这个包装器的渲染函数中,如果标志为真,则渲染<Provider>,否则,渲染一些临时视图。

【讨论】:

无法再访问此文件的任何人:github.com/rt2zz/redux-persist/blob/…

以上是关于在使用 redux-persist 重新水化存储之前加载初始状态的默认值的主要内容,如果未能解决你的问题,请参考以下文章

从持久存储重新水化后,Vuex getter 不会更新

为啥 Redux-Persist 不持久化存储

如何在完成商店补液后更新App.js中的状态?

如何解决:console.error:“redux-persist 未能创建同步存储。回退到“noop”存储

让 redux-persist 在数据恢复时通知我

Redux-persist 没有更新状态