Вы отлично справились, вы также очень хорошо структурировали функциональный компонент для PrivateRoute
, но при доступе к реквизиту есть ошибка, и при использовании в качестве this.props.isAuthenticated
, первое, что this.props
используется только и только в основанный на классах компонент React или вы можете использовать его как (props.isAuthenticated
предполагается, что вы прошли isAutheticated prop
в PrivateRoute
функциональный компонент React).
набранные вами очки -
- Вы подключили свое глобальное состояние к этому функциональному компоненту PrivateRoute.
- Вы структурно определили свой функциональный компонент PrivateRoute.
Состояние Redux -
state: {
auth: {userId: 'ob2-51-hw-s124' // any random string based on your API},
otherReducer: {...}
}
Точки, которые необходимо выполнить -
- импорт
connect
из модуля react-redux
. - импорт
Route
, Redirect
из модуля react-router-dom
.
Итоговый код
AppRouter. js
// module import
import LandingPage from '...';
import NotFoundPage from '...';
import DashBoardPage from '...';
import LoginPage from '...';
// React functional component that can be imported in App.js
const AppRouter = () => (
<Router history={history}>
<div>
<Switch>
<PublicRoute path="/" exact={true}>
<LandingPage />
</PublicRoute>
<PrivateRoute path="/dashboard">
<DashboardPage />
</PrivateRoute>
<PrivateRoute path="/login">
<LoginPage />
</PrivateRoute>
<PublicRoute path="/help" >
<HelpPage />
</PublicRoute>
<Route>
<NotFoundPage />
</Route>
</Switch>
</div>
</Router>
);
export default AppRouter;
PrivateRoute. js
// module import
import React form 'react';
import { connect } from 'react-redux';
import { Route, Redirect } from 'react-router-dom';
// React functional PrivateRoute component
export const PrivateRoute = ({
auth,
children,
...rest
}) => {
const isAuthenticated = !!auth.userId; // converting auth.userId(typeof string) to false/true(typeof boolean)
return (
<Route {...rest} component={(props) => (
isAuthenticated ? (
children
) : (
<Redirect
to={{
pathname: '/login',
state: {
from: props.location
}
}}
/>
)
)}
/>
);
}
// redux connect
const mapStateToProps = (state) => ({
auth: state.auth
});
export default connect(mapStateToProps)(PrivateRoute);