Значения по умолчанию из начального состояния загружаются до того, как хранилище регидратируется с помощью сокращения-persist
У меня возникают проблемы с доступом к сохраненным данным после запуска приложения с redux-persist.
Редуктор инициализируется данными, определенными в моем начальном состоянии. К тому моменту, когда предыдущее состояние сеанса загружается с AsyncStorage, компонент уже отображается с данными по умолчанию.
Я знаю, что данные сохраняются и извлекаются успешно. Если я оставлю экран другим и вернусь к нему, я увижу, что данные отображаются правильно. Отладка состояния и реквизита также показывает, что это проблема асинхронного синхронизации.
Как я могу отложить загрузку контейнеров-редуктов после того, как хранилище будет регидратировано. В качестве альтернативы, могу ли я принудительно обновить conatainer (и его дочерние элементы) для обновления при завершении загрузки магазина?
Вот что я пробовал.
для настройки моего магазина:
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,
}
}
И это редуктор:
import {REHYDRATE_STORE} из '../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 при завершении регидратации, я все равно не могу понять, как принудительно обновить компонент контейнера.
Ответы
Ответ 1
Я решил это, выполнив этот рецепт:
delay-render-until-rehydration-complete
В основном решение выглядит следующим образом:
В компоненте, который обертывает <Provider>
, создайте флаг локального состояния, который отслеживает, сохраняет ли хранилище еще или нет. Использование обратного вызова persistStore() для обновления этого флага.
В функции рендеринга этой обертки, если флаг имеет значение true, визуализируйте <Provider>
, в противном случае сделайте некоторое временное представление.