Хранилище Redux, доступное вне компонента, возвращает начальное состояние

Я хотел бы знать, выполнимо ли то, чего я пытаюсь достичь, и если да, то я хотел бы узнать, что я делаю не так. Я использую библиотеку react-native-Threads для создания отдельного «потока». Внутри должна быть какая-то функция setInterval, которая проверяет текущее состояние приложения, скажем, каждые 20 секунд. Теперь внутри этой темы я пытался сделать что-то похожее на то, что было описано в лучшем ответе на этот вопрос: Как лучше всего получить доступ к хранилищу redux за пределами компонента реакции? Однако я использую redux-persist, поэтому я не иметь простую переменную store внутри конфигурационного файла магазина. Код для настройки магазина:

    const rootReducer = combineReducers({
    appState: appStateReducer,
    entries: entriesReducer,
    listHelper: listHelperReducer,
    authenticate: authenticateReducer
})

const persistConfig = {
    key: 'root',
    storage,
    stateReconciler: autoMergeLevel2,
    blacklist: [ 'appState' , 'listHelper'],
    whitelist: ['authenticate' , 'entries']

}
const pr = persistReducer(persistConfig, rootReducer)
const configureStore = () => {
    const store = createStore(pr,  devToolsEnhancer({ realtime: true, hostname: 'localhost', port: 8082 }))

    const persistor = persistStore(store)
    return { persistor, store }
}
export default configureStore

Я попытался импортировать configureStore из этого файла и получить доступ к такому состоянию внутри index.thread.js:

console.tron.log(configureStore().store.getState());

Однако это возвращает исходное состояние. Мне нужно текущее состояние, после регидратации. Кто-нибудь пробовал решить подобную проблему? Буду очень признателен за любые подсказки. Спасибо.

Изменить: вот файл index.js, в котором вызывается configureStore.

const store = configureStore();
const RNRedux = () => (
  <Provider store={store.store}>
    <PersistGate loading={<LoadingScreen />} persistor={store.persistor}>
      <App />
    </PersistGate>
  </Provider>
);


AppRegistry.registerComponent("ProjectName", () => RNRedux);

person Annie Hill    schedule 17.09.2018    source источник
comment
Вы создаете новое хранилище каждый раз, когда вызываете configureStore(), поэтому значения по умолчанию configureStore().   -  person Niekert    schedule 17.09.2018
comment
Да, я предположил это. Как я могу получить доступ к уже созданному магазину? ConfigureStore () вызывается внутри моего index.js, но я не могу экспортировать туда без сбоя приложения.   -  person Annie Hill    schedule 17.09.2018
comment
Возможно, вместо экспорта функции с именем configureStore вы можете запустить анализ кода этой функции непосредственно на уровне модуля и напрямую экспортировать store и persistor.   -  person Niekert    schedule 17.09.2018
comment
@AnnieHill Привет, тебе удалось это решить?   -  person Greco Jonathan    schedule 19.02.2019


Ответы (2)


Вы можете вызвать createStore в файле магазина и экспортировать его оттуда.

const pr = persistReducer(persistConfig, rootReducer);
const store = createStore(pr,  devToolsEnhancer({ realtime: true, hostname: 'localhost', port: 8082 }))
const configureStore = () => {
    const persistor = persistStore(store)
    return { persistor, store }
}

export default configureStore

Теперь вы можете использовать магазин, как показано ниже.

console.tron.log(configureStore.store.getState());
person Ishan Trivid    schedule 17.09.2018
comment
К сожалению, когда я делаю это так, как вы описали выше, я получаю эту ошибку: undefined не является объектом (оценка _configureStore2.default.configureStore.store) Затем, если я назову это так: configureStore (). Store.getState ( ) он снова возвращает исходное состояние. Или, если я импортирую его так: {configureStore} я получаю ту же ошибку, что и упомянутая выше, но немного другую (_configureStore.configureStore.store) - person Annie Hill; 20.09.2018
comment
Я пробовал вот так: const pr = persistReducer(persistConfig, rootReducer) export const store = createStore(pr, devToolsEnhancer({ realtime: true, hostname: 'localhost', port: 8082 })) export const persistor = persistStore(store, null, () => { console.log('state', store.getState()); }); Но я все еще получал новый экземпляр магазина - person Annie Hill; 20.09.2018

Я обнаружил, что моя проблема заключалась в циклических зависимостях между файлами. Это оставило некоторые переменные неинициализированными, поэтому я бы рекомендовал дважды проверить это.

person Martin    schedule 25.09.2019