Я пытаюсь настроить защищенные маршруты, где пользователь перенаправляется на страницу / login, если они не вошли в систему, но это не работает при использовании redux.
Это мой компонент ProtectedRoute:
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Route, Redirect } from 'react-router-dom';
import { authenticate } from './actions';
const ProtectedRoute = ({
component: Component, authenticate, isAuthenticated, ...rest
}) => {
useEffect(() => {
authenticate();
});
return (
<Route
{...rest}
render={props => (isAuthenticated ? (
<Component {...props} />
) : (
<Redirect to="/login" />
))
}
/>
);
};
ProtectedRoute.propTypes = {
component: PropTypes.elementType.isRequired,
authenticate: PropTypes.func.isRequired,
isAuthenticated: PropTypes.bool.isRequired,
};
const mapStateToProps = state => ({
isAuthenticated: state.isAuthenticated,
});
const mapDispatchToProps = {
authenticate,
};
export default connect(mapStateToProps, mapDispatchToProps)(ProtectedRoute);
А вот и маршруты:
<Provider store={store}>
<Router>
<Switch>
<ProtectedRoute exact path="/" component={App} />
<Route path="/login" component={LoginPage} />
</Switch>
</Router>
</Provider>
Теперь, прежде чем вы отметите это как дубликат, я пробовал решения в других темах.
Использование withRouter
не работает.
withRouter(connect(mapStateToProps, mapDispatchToProps)(ProtectedRoute))
То же самое с {pure: false}
connect(mapStateToProps, mapDispatchToProps, null, {pure: false})(ProtectedRoute);
Я также использую Switch
. Я не уверен, как заставить это работать.