大多数情况中,我们必须先验证登录状态才能进入到主页,所以需要保护式路由。这里,需要保护的路由是Admin,如果登录没通过则先进入Login路由组件。
class App5 extends React.Component {
render(){
return (
<div className="app5">
<ul>
<li>
<Link to='/'>Home</Link>
</li>
<li>
<Link to='/category'>Category</Link>
</li>
<li>
<Link to='/products'>Products</Link>
</li>
<li>
<Link to='/admin'>Admin</Link>
</li>
</ul>
<Route exact path='/' component={Home} />
<Route path='/category' component={Category} />
<Route path='/products' component={Products} />
<Route path='/login' component={Login} />
{/*自定义路由*/}
<PrivateRoute path='/admin' component={Admin} />
</div>
)
}
}
const Home = props => <h2>This is Home {console.log('Home-Props')}{console.log(props)}</h2>
const Admin = () => <h2>Welcome to admin!</h2>
// 自定义路由
const PrivateRoute = (({component:Component,...rest}) => {
return (
<Route
{...rest}
render={props =>
// 如果登录验证通过则进入Admin路由组件
fakeAuth.isAuthenticated === true
?(<Component />)
// 将from设置为Admin路由pathname,并传递给子组件Login
:(<Redirect to={{pathname:'/login',state:{from:props.location.pathname}}} />)
}
/>
)
})
export default App5
Login路由组件如下
class Login extends React.Component {
constructor(){
super()
this.state = {
toAdmin:false
}
}
login = () =>{
fakeAuth.authenticate(() => {
this.setState({
toAdmin:true
})
})
}
render(){
const from = this.props.location.state.from
const toAdmin = this.state.toAdmin
if(toAdmin) {
return (
<Redirect to={from} />
)
}
return (
<div className="login">
{console.log(this.props)}
<p>You must log in then go to the{from} </p>
<button onClick={this.login}>
Log in
</button>
</div>
)
}
}
export default Login
export const fakeAuth = {
// 验证状态
isAuthenticated:false,
authenticate(cb){
this.isAuthenticated = true
setTimeout(cb,100)
}
}
打印台中 从Admin路由组件传递给子组件Login的Props如图
![](https://img.haomeiwen.com/i10766661/346d87187581f331.png)
// 自定义路由
const PrivateRoute = (({component:Component,...rest}) => {
return (
<Route
{...rest}
render={props =>
// 如果登录验证通过则进入Admin路由组件
fakeAuth.isAuthenticated === true
?(<Component />)
// 将from设置为Admin路由pathname,并传递给子组件Login
:(<Redirect to={{pathname:'/login',state:{from:props.location.pathname}}} />)
}
/>
)
})
自定义路由传递给Login组件的state也在里面
网友评论