アプリがredux-persistで起動した後、保存されたデータにアクセスできません。
レデューサーは、初期状態で定義されたデータで初期化されます。前のセッションの状態が AsyncStorage で読み込まれるまでに、コンポーネントは既定のデータで既に表示されています。
データが保存され、正常にフェッチされることはわかっています。別の画面に移動して戻ってくると、データが正しく表示されていることがわかります。状態と小道具をデバッグすると、これが非同期タイミングの問題であることも示されます。
ストアが再水和した後、redux コンテナーのロードを遅らせるにはどうすればよいですか。または、ストアの読み込みが完了したときにコンテナ (およびその子) を強制的に更新して更新することはできますか?
これが私が試したことです。ストアを構成するには:
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,
}
}
そしてそれはレデューサーです: import { REHYDRATE_STORE } from '../actions/types' const initialState = { storeIsReady: false }
export default function reducer(state = initialState, action){
switch (action.type) {
case REHYDRATE_STORE:
return {...state, storeIsReady:true}
break;
default:
return state
break;
}
}
しかし、リハイドレーションが完了すると storeIsReady 状態が true に変わりますが、コンテナー コンポーネントを強制的に更新する方法がまだわかりません。