React Redux Persist выполняет регидратацию, но сохраненные данные не извлекаются, вместо этого по умолчанию - PullRequest
0 голосов
/ 08 января 2020

Я боролся с этой проблемой в течение двух дней, поэтому мне нужна помощь!

У меня есть веб React, в который я добавил Redux Persist (также Redux Saga для обработки запросов) в качестве документации Сказал.

Я тестирую с магазином, в котором нет саги в середине, когда я запускаю действие, данные обновляются, я вижу их в отладчике, но когда я переосмысливаю sh, несмотря на запуск процесса Redux Hydrate, это значение возвращается к значению по умолчанию.

store. js

import { createStore, applyMiddleware, compose } from 'redux';
import createSagaMiddleware from 'redux-saga'
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';

import rootReducer from './reducers';  
// import rootSaga from './sagas';


const persistConfig = {
    key: 'root',
    storage: storage,
    // whitelist: ['login', 'account', 'layout'],
    stateReconciler: autoMergeLevel2, // see "Merge Process" section for details.    
};

const persistedReducer = persistReducer(persistConfig, rootReducer);
const sagaMiddleware = createSagaMiddleware();
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;


const store = createStore(persistedReducer, composeEnhancers(applyMiddleware(sagaMiddleware)));
const persistor = persistStore(store);

export { store, persistor, sagaMiddleware };

redurs. js

import { combineReducers  } from 'redux';

// Front
import layout from './layout/reducer';

// Authentication Module
import account from './auth/register/reducer';
import login from './auth/login/reducer';
import forget from './auth/forgetpwd/reducer';

const rootReducer = combineReducers({
    layout,
    account,
    login,
    forget
});

export default rootReducer;

редуктор. js (тот, который я тестирую, Макет)

import { ACTIVATE_AUTH_LAYOUT, ACTIVATE_NON_AUTH_LAYOUT, TOGGLE, TOGGLE_LD } from './actionTypes';

const initialState={
    topbar:true,
    sidebar:true,
    footer:true,
    is_toggle : true,
    is_light : true
}

const layout = (state=initialState,action) => {
    switch(action.type){
        case ACTIVATE_AUTH_LAYOUT:
            state = {
                ...state,
                ...action.payload
            }
            break;
        case ACTIVATE_NON_AUTH_LAYOUT:
            state = {
                ...state,
                ...action.payload
            }
            break;

        case TOGGLE:
            state = {
                ...state,
                is_toggle : action.payload
            }
            break;

        case TOGGLE_LD:
            state = {
                ...state,
                is_light : action.payload
            }
            break;

        default:
            // state = state;
            break;
    }
    return state;
}

export default layout;

действия. js

import { ACTIVATE_AUTH_LAYOUT, ACTIVATE_NON_AUTH_LAYOUT, TOGGLE, TOGGLE_LD } from './actionTypes';

export const activateAuthLayout = () => {
    return {
        type: ACTIVATE_AUTH_LAYOUT,
        payload: {
            topbar: true,
            sidebar: true,
            footer: true,
            rodri: 'butta',
            layoutType: 'Auth'
        }
    }
}

export const activateNonAuthLayout = () => {
    return {
        type: ACTIVATE_NON_AUTH_LAYOUT,
        payload: {
            topbar: false,
            sidebar: false,
            footer: false,
            layoutType: 'NonAuth'
        }
    }
}

export const toggleSidebar = (is_toggle) => {
    return {
        type: TOGGLE,
            payload: is_toggle 

    }
}

export const toggleLightDark = (is_light) => {
    return {
        type: TOGGLE_LD,
            payload: is_light 

    }
}


index. js (APP)

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/lib/integration/react';

import rootSaga from './store/sagas';

import {persistor, store, sagaMiddleware} from './store';

sagaMiddleware.run(rootSaga);



const app = (
    <Provider store={store}>
        <PersistGate loading={null} persistor={persistor}>
            <BrowserRouter>
                <App />
            </BrowserRouter>
        </PersistGate>
    </Provider>
);

ReactDOM.render(app, document.getElementById('root'));
serviceWorker.unregister();

И фрагменты класса

...
this.props.toggleSidebar(!this.props.is_toggle);
...

const mapStatetoProps = state => {
    const { is_toggle,is_light } = state.layout;
    return {  is_toggle,is_light };
}

export default withRouter(connect(mapStatetoProps, { toggleSidebar })(Topbar));

Отладчик

Первый запуск, когда я переключаю строку меню, чтобы активировать действие)

enter image description here

После обновления браузера регидрат должен привести макет -> is_toggle к значению false, но он остается верным (по умолчанию)

enter image description here

Цветные фрагменты

enter image description here

enter image description here

enter image description here

enter image description here enter image description here

1 Ответ

2 голосов
/ 08 января 2020

Я думаю, что ваша проблема в том, как вы настраиваете store:

const store = createStore(persistedReducer, composeEnhancers(applyMiddleware(sagaMiddleware)));

Структура этой функции createStore(reducer, [preloadedState], [enhancer])

Итак, вы пытаетесь передать свой enhancers as preloadedState.

Попробуйте изменить его на следующее:

const store = createStore(persistedReducer, {}, composeEnhancers(applyMiddleware(sagaMiddleware)));

Кроме того, когда вы настраиваете persistConfig, я вижу, что у вас закомментирован белый список. Любое состояние редуктора, которое вы хотите сохранить, должно быть в этом списке, поэтому его не следует комментировать:

// whitelist: ['login', 'account', 'layout'],  // uncomment this

И, наконец, как примечание, вам не нужно break во всех переключателях случаи

...