значение не читается с помощью redux-persist при загрузке приложения - PullRequest
0 голосов
/ 08 мая 2020

Я недавно начал реагировать / реагировать-native и пробовал реагировать-собственное приложение. Моя идея состоит в том, чтобы установить client_id, который сохраняется при запуске, перезапуске, удалении и установке приложения.

Поэтому, когда я пытаюсь сохранить из редактора (ctrl + s), я вижу, что клиент сохраняется и остается таким же. Когда я закрываю приложение и перезапускаю его, идентификатор клиента меняется (выполняется с мобильного устройства или refre sh r с сервера node/js). но когда я сохраняю (ctrl + s) без каких-либо изменений кода, идентификатор клиента возвращается к исходному идентификатору, который был сгенерирован первым (первое действие отправки). Итак, я понимаю, что значение сохраняется, но приложение не читает из постоянного хранилища, и именно поэтому оно показывает разные числа при каждом запуске (или refre sh из node/js окна сервера). Но как обеспечить чтение значения из хранилища при запуске / повторном запуске.

Может ли кто-нибудь помочь мне решить эту проблему? Я пытаюсь за последние несколько дней. Заранее спасибо. Вот мой код.

// clientstore.js
const persistConfig = {
    key: 'root',
    storage: AsyncStorage,
    stateReconciler: hardSet,
};

export default function getStore() {
    const persistedReducer = persistReducer(persistConfig, storeReducer);
    let store = createStore(persistedReducer);
    let persistor = persistStore(store);
    return { store, persistor };
}

// storereducer.js

const defaultState = {
    client_id: ''
}

const storeReducer = (state = defaultState, action = {}) => {
    const { type, payload } = action;
    var tmp_object = Object.assign({}, state);
    switch (type) {
        case 'SET_CLIENTID':
            tmp_object.client_id = state.client_id.toString()=='' ? payload : state.client_id;
            return tmp_object;
        default:
            return state;
    }
}

//App.js
const { store, persistor } = getStore();
persistor.persist(); // adding or removing makes no difference
const App = () => {
    if (store.getState().client_id.toString()=='') {
      store.dispatch({type: 'SET_CLIENTID', payload: genTerrierToken()});
      persistor.flush(); //adding or removing makes no difference
    }
    return (
        <View><Text>
            Client ID: {store.getState().client_id}
        </Text></View>
    );
}

1 Ответ

0 голосов
/ 09 мая 2020

Наконец, я смог решить эту проблему :) Я получил искру от https://blog.isquaredsoftware.com/presentations/workshops/redux-fundamentals/react-redux.html# / 1

и изменил приложение. js на

const { store, persistor } = getStore();

const App = () => {
    if (store.getState().client_id.toString()=='') {
      store.dispatch({type: 'SET_CLIENTID', payload: genTerrierToken()});
    }
    return (
        <View><Text>
            Client ID: {store.getState().client_id}
        </Text></View>
    );
}

export default () => {
  return (
    <Provider store={store}>
      <PersistGate loading={<ActivityIndicator />} persistor={persistor}>
        <App />
      </PersistGate>
    </Provider>
  );
}

Теперь все работает идеально.

...