我创建了一个登录组件,上面有所有逻辑东西。
登录减少器是:
const openState = {
loggedIn: null,
user: null
}
export default (state = openState, action) => {
switch (action.type) {
case LOGIN:
return { ...state, loggedIn: true, user: action.payload }
case LOGOUT:
return { ...state, loggedIn: false, user: null }
default:
return openState
}
}
那个行动 :
export const logIn = (user) => {
return {
type: LOGIN,
payload: user
}
}
export const logOut = () => {
return {
type: LOGOUT
}
}
一切工作都很好,但是我不确定如何将动作中的loggedIn
anduser
道具传递到路由组件中,以确保所有路由的安全:
const MainRoutes = props => {
const { loggedIn } = props;
console.log(props.loggedIn)
return (
<Router history={history}>
<Baseline />
<Menu/>
<Container maxWidth="md">
<Switch>
<Route exact path="/Login" component={Login} />
<Route exact path="/Carousel" component={Carousel} />
<Route exact path="/Stepper" component={Stepper} />
<Route component={NotFound} />
</Switch>
</Container>
</Router>
);
}
const mapStateToProps = (state) => {
return { loggedIn: state.loggedIn };
};
export default connect(mapStateToProps)(MainRoutes);
如果我会console.logloggedIn
道具,我将无法定义:| 基于此,loggedIn
我可以将逻辑创建到路由组件中。
正如其他人已经描述的那样,您最好创建一条保护路线来完成您想要的。如果用户未登录,则只需将其重定向到“登录”路由。
这是我的实现:(codesandbox)
import React from "react";
import { Route, Redirect } from "react-router-dom";
import { connect } from "react-redux";
const ProtectedRoute = ({
path,
component: Component,
render,
loggedIn,
...rest
}) => {
return (
<Route
path={path}
{...rest}
render={(props) => {
if (loggedIn) {
return Component ? <Component {...props} /> : render(props);
}
return (
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
);
}}
/>
);
};
const mapStateToProps = (state) => {
const { loggedIn } = state.auth;
return {
loggedIn
};
};
export default connect(mapStateToProps)(ProtectedRoute);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句