我的应用程序需要用户进行身份验证才可以访问特定的路线。对于这一点,我想跟随反应,路由器auth-workflow example
routes / index.js
// Private Route
import PrivateRoute from "../containers/PrivateRoute";
export default (
<Switch>
<Route
path="/login"
component={Login}
exact={true}/>
<Route
path="/changePassword"
component={ChangePassword}
exact={true}/>
<PrivateRoute
path="/groups"
component={ListGroups}
exact={true}/>
<Route
path="/verify"
component={VerificationCode}
exact={true}/>
<Route component={NoMatch}/>
</Switch>
);
容器/专用路由
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
import PrivateRoute from "../routes/PrivateRoute";
const mapStateToProps = (state) => {
return {
jwtTokens: state.auth.jwtTokens,
email: state.auth.email,
isAuthenticated: state.auth.isAuthenticated
};
};
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({}, dispatch);
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(PrivateRoute);
路由/ PrivateRoute.js
export default function PrivateRoute({ component: Component, ...rest }) {
return (
<Route
{...rest}
render={(props) => {
return (props.isAuthenticated) ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/login",
state: {
from: props.location
}
}}
/>
);
}}
/>
);
}
在Chrome DevTools中进行调试时,进入render
函数时,无法像在rest
中那样获得完整的值。下面截图表示我的调试在Chrome和值I可以在每个阶段看到:
在上图中,我可以看到这些值; jwtTokens
,isAuthenticated
和email
。据以下示例所知,如何在rest
上使用传播运算符是如何将值作为参数传递给render
的。下一个屏幕截图显示情况并非如此:
我能够简单地使用rest
PARAM访问的属性,但不应该被我很容易地能够从访问相同的值props
,以及?
答案 0 :(得分:1)
您用来渲染Route
的{{1}}的渲染回调不会转发Component
从外部接收到的道具。它仅包含路由的Route
,location
和match
。您可能想要做的是将params
传播到rest
中,而不是将<Component />
用作Route
,将不会使用其中任何一个,也不会期望这些道具:< / p>
Route
出于相同的原因,您还需要检查export default function PrivateRoute({ component: Component, ...rest }) {
return (
<Route
render={(props) => {
return (rest.isAuthenticated) ? (
<Component {...props} {...rest} /> {/* add rest here instead */}
) : (
<Redirect
to={{
pathname: "/login",
state: {
from: props.location
}
}}
/>
);
}}
/>
);
}
而不是rest.isAuthenticated
。 props.isAuthenticated
不会出现在传递给isAuthenticated
回调的道具中。
Also see in the react-router docs about Route props关于将哪些道具传递给render
回调:
路线道具
所有三个render methods将通过相同的三个路线道具