Я немного скорректировал пример React Router для частных маршрутов, чтобы хорошо играть с Redux, но никакие компоненты не отображаются при связывании или перенаправлении на другие "страницы". Пример можно найти здесь:
https://reacttraining.com/react-router/web/example/auth-workflow
Их компонент PrivateRoute выглядит следующим образом:
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Но, поскольку я включил его в приложение Redux, мне пришлось немного настроить PrivateRoute, чтобы я мог получить доступ к хранилищу редуктов, а также к поисковому сервису:
const PrivateRouteComponent = (props) => (
<Route {...props.routeProps} render={() => (
props.logged_in ? (
<div>{props.children}</div>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}} /> )
)} />
);
const mapStateToProps = (state, ownProps) => {
return {
logged_in: state.auth.logged_in,
location: ownProps.path,
routeProps: {
exact: ownProps.exact,
path: ownProps.path
}
};
};
const PrivateRoute = connect(mapStateToProps, null)(PrivateRouteComponent);
export default PrivateRoute
Всякий раз, когда я не вошел в систему и не попал в PrivateRoute, я правильно перенаправлен в /login. Однако после того, как, например, при входе и использовании <Redirect .../>
или нажатии любой <Link ...>
на PrivateRoute, URI обновляется, но в представлении нет. Он остается на одном компоненте.
Что я делаю неправильно?
Чтобы завершить изображение, в приложении index.js
есть некоторые нерелевантные вещи, и маршруты настраиваются следующим образом:
ReactDOM.render(
<Provider store={store}>
<App>
<Router>
<div>
<PrivateRoute exact path="/"><Home /></PrivateRoute>
// ... other private routes
<Route path="/login" component={Login} />
</div>
</Router>
</App>
</Provider>,
document.getElementById('root')
);