react前置路由守卫

react中一切皆组件--2018.7.18
 
目标:自定义user界面的前置路由守卫,当用户点击要进入user组件时,路由守卫发起判断,如果条件满足则进入,否则跳转至login组件。
 
 
1.入口文件index.js中代码如下:
 
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import registerServiceWorker from './registerServiceWorker';
import Home from './routes/home'
import {BrowserRouter,Route,Switch,Redirect,NavLink} from 'react-router-dom'
import User from './routes/user';
import Login from './routes/login';
import List from './routes/list';
import Error from './routes/error'
import Authuser from './routes/authuser'
import './assets/link.css'
class App extends Component{
    render(){
        return (
            <div>
                <NavLink activeClassName="link" to="/home" >Home</NavLink>
                <NavLink activeClassName="link" to="/user" >User</NavLink>
                <NavLink activeClassName="link" to="/login" >Login</NavLink>
                <NavLink activeClassName="link" to="/list" >List</NavLink>
                <NavLink activeClassName="link" to="/error" >Error</NavLink>
                <Switch>
                    <Redirect exact from='/' to='/home' />
                    <Route path="/home" component={Home}/>
                    <Authuser path='/user' component={User}/>
                    <Route path="/login" component={Login}/>
                    <Route path="/list" component={List}/>
                    <Route path='/error' component={Error} />
                    <Route component={Error} />
                </Switch>
            </div>
        )
    }
}
ReactDOM.render(
    <BrowserRouter >
     <Route component={App}/>
    </BrowserRouter>,
    document.getElementById('root'));
registerServiceWorker();
 
其中authuser是我们自定义的组件,当给组件添加path和component两个props后,这个组件会被识别为一个route,因此点击User链接后,会触发Authuser组件
 
 
2.Authuser的代码如下:
import React,{Component} from 'react';
import {Route,Redirect} from 'react-router-dom'
 
//函数式组件的写法
// let Authuser = ({component:Component,...rest})=>{
//     return  <Route {...rest} render={(props)=>{
//         return   Math.random() <0.5 ? <Component {...props}/> : <Redirect to='/login' />
       
//     }}/>
// }
 
 
//类组件的写法
class Authuser extends Component{
    constructor(){
        super()
        this.state={
            hasReq:false,
            authuser:false,
            username:"",
            data:{}
        }
    }
    componentDidMount(){
        //组件挂载完毕之后异步读取数据,并更新state
        fetch(
            `/data/data.json`
        ).then(
          (res)=>{
            return res.json()
          }
        ).then((res)=>{
            this.setState(
                {
                    hasReq:true,
                    authuser:res.authuser,
                    username:res.id,
                    data:res.password
                }
            )
        })
    }
    render(){
        let {component:Component,...rest} = this.props
        //解构组件身上的props,将component单独拿出来,如果条件满足,则允许进入该component,将剩余参数放入rest,rest是一个对象
        //此处Component == User
        if (!this.state.hasReq) {return null}
        //组件被触发后会首先渲染一次,但此时state中的hasReq状态未被更新,当此处hasReq未被更新时,我们先不渲染页面,直到组件挂载完毕异步操作返回结果并更新state中的数据后,我们再执行下一步操作
        return (
                //组件最终返回的仍然是一个Route
            <Route {...rest} render={(props)=>{
                //将传递进来的props展开传给Route组件,render函数接收参数props并进行一系列判断,决定路由跳转至哪个组件,同时可以将props继续向下传递
                        return (this.state.authuser?<Component  {...props} username={this.state.username}/> : <Redirect to='/login' />      )          
                    }}/>
        )
    }
}
export default Authuser

摘抄保存用的 非原创

转载于:https://www.cnblogs.com/wenbodeboke/p/9915347.html

React中实现路由守卫可以使用React Router库来帮助管理路由和导航。React Router提供了一种简单的方式来实现路由守卫,可以通过定义适当的组件来控制页面访问权限。 以下是一个基本的示例,展示了如何使用React Router实现路由守卫: 1. 首先,安装React Router库: ``` npm install react-router-dom ``` 2. 在你的应用程序中导入所需的模块: ```jsx import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom'; ``` 3. 定义一个私有路由组件,用于验证用户是否有权限访问特定页面。需要传入以下参数:`component`(要渲染的组件)、`isAuthenticated`(表示用户是否已经登录)、`...rest`(其他包含路由参数的属性)。 ```jsx const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to="/login" /> // 没有权限,重定向到登录页面 ) } /> ); ``` 4. 在应用程序的根组件中设置路由路由守卫。这将包裹整个应用程序,并根据需要定义私有和公共路由。 ```jsx const App = () => { const isAuthenticated = checkUserAuthentication(); // 检查用户是否已经登录 return ( <Router> <Switch> <Route exact path="/login" component={Login} /> // 公共路由,任何人都可以访问 <PrivateRoute path="/dashboard" component={Dashboard} isAuthenticated={isAuthenticated} // 私有路由,需要用户登录才能访问 /> </Switch> </Router> ); }; ``` 在上述代码中,`<PrivateRoute>` 组件用于保护需要用户登录才能访问的页面(例如仪表板)。如果用户未经身份验证,将重定向到登录页面。 请注意,上述示例中的 `checkUserAuthentication` 函数是一个示例,你需要根据实际需求自行实现。 这就是使用React Router实现基本的路由守卫的方法。你可以根据具体项目需求进行更复杂的路由守卫逻辑的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值