Я использую redux-persist для отслеживания токена пользователя и PrivateRoutes для доступа к главной панели мониторинга. Persist: опросы хранятся в локальном хранилище с токеном JWT. Если я нажимаю только на маршруты, отмеченные как все работает, как ожидалось, однако, когда я нажимаю на что-то вроде «Политика конфиденциальности», которая не является частной, мое локальное хранилище сохраняется: опросы сбрасываются.
Я не уверен если это проблема с PrivateRoute, redux-persist или чем-то еще полностью? Вот мой магазин. js file:
import storage from 'redux-persist/es/storage'
import {applyMiddleware, compose, createStore} from 'redux'
import {createFilter} from 'redux-persist-transform-filter';
import {persistReducer, persistStore} from 'redux-persist'
import {routerMiddleware} from 'react-router-redux'
import thunk from 'redux-thunk';
import apiMiddleware from './middleware';
import rootReducer from './reducers'
// This is helpful: https://github.com/edy/redux-persist-transform-filter
export default (history) => {
const persistedFilter = createFilter(
'auth', ['access', 'refresh', 'username']
);
const reducer = persistReducer(
{
key: 'polls',
storage: storage,
whitelist: ['auth'],
transforms: [persistedFilter]
},
rootReducer
);
// This is used for setup here: https://github.com/zalmoxisus/redux-devtools-extension#usage
// This was copied from ds-rebuild folder.
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
// Add thunk to handle error: "Error: Actions must be plain objects. Use custom middleware for async actions."
const store = createStore(
reducer,
{},
composeEnhancers(applyMiddleware(apiMiddleware, thunk, routerMiddleware(history)))
);
persistStore(store);
return store
}
А вот мой PrivateRoute
import React from 'react'
import { Route, Redirect } from 'react-router'
import { connect } from 'react-redux'
import * as reducers from '../reducers'
const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (
<Route {...rest} render={props => (
isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
);
const mapStateToProps = (state) => ({
isAuthenticated: reducers.isAuthenticated(state)
});
export default connect(mapStateToProps, null)(PrivateRoute);
Наконец, вот мой основной маршрутизатор приложений
function LandingApp() {
return (
<ConnectedRouter history={history}>
<Switch>
<PrivateRoute exact path="/(app|profile)" component={App}/>
<Route exact path="/" component={Theme1}/>
<Route exact path="/login" component={Login1}/>
<Route exact path="/signup" component={SignUp1}/>
<Route exact path="/privacy" component={Privacy}/>
<Route exact path="/tos" component={Terms}/>
<Route component={NotFound}/>
</Switch>
</ConnectedRouter>
)
}
export default LandingApp;