美文网首页React
react-router4.x 路由权限控制

react-router4.x 路由权限控制

作者: 天天快乐520 | 来源:发表于2018-01-17 16:12 被阅读0次
想必大家在使用react-router的时候,有的组件是需要登录才能访问的(private),有的是开放的(public)

现在给大家介绍一下我的实现方式(仅供参考,如有更好的思路,欢迎在评论区回复)
1.第一种封装一个私有路由
这是我的路由配置,Route大家都知道。不用多讲。PrivateRoute 这个是我自己封装的代码如下:
PrivateRoute.jsx


import React from 'react';
import {Route,Redirect,withRouter} from 'react-router-dom';
import PropTypes from 'prop-types';
import storage from 'utils/storage.js';
//私有路由,只有登录的用户才能访问
class PrivateRoute extends React.Component{
    componentWillMount(){
        let  isAuthenticated =  storage.getItem("token") ? true :false;
        this.setState({isAuthenticated:isAuthenticated})
        if(!isAuthenticated){
          const {history} = this.props;
          setTimeout(() => {
            history.replace("/login");
          }, 1000)
        }
    }
    render(){
        let { component: Component,path="/",exact=false,strict=false} = this.props;
        return this.state.isAuthenticated ?  (
            <Route  path={path} exact={exact}  strict={strict}  render={(props)=>( <Component {...props} /> )} />
        ) : ("请重新登录");
    }
}
PrivateRoute.propTypes  ={
        path:PropTypes.string.isRequired,
        exact:PropTypes.bool,
        strict:PropTypes.bool,
        component:PropTypes.func.isRequired
}
export default withRouter(PrivateRoute);

使用:

.......
import React from 'react';
import {BrowserRouter as Router , HashRouter ,  Route,Link,Switch ,withRouter} from 'react-router-dom';
import {syncHistoryWithStore} from 'react-router-redux'
import reducer from '../reducers/index.js';
import Home from 'container/Home.jsx';
import Login from 'container/Login.jsx';
import Regist from 'container/Regist';
import PrivateRoute from 'component/common/PrivateRoute.jsx';
.......
<Route {...props} path="/login" component={Login} />
<Route {...props} path="/regist" component={Regist} />
<PrivateRoute  path="/home"  component={Home} />
<Route  {...props}  component={Login} />

代码很简单,仔细看一下就明白。这里的PrivateRoute 属性接口和 Route基本类似。我这里只是提供一种思路,大家可以根据自己的业务添加自己的特色。

  1. 第二种是使用高阶组件。

高阶组件(HOC)是react中对组件逻辑进行重用的高级技术。但高阶组件本身并不是React API。它只是一种模式,这种模式是由react自身的组合性质必然产生的。具体而言,高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件。

现在知道了高阶组件是什么,现在我们就用该思路来做一个高阶私有路由 HocPrivateRoute代码如下
HocPrivateRoute.jsx

import React from 'react';
import {Route,Redirect,withRouter} from 'react-router-dom';
import PropTypes from 'prop-types';
import storage from 'utils/storage.js';

function withHocPrivateRoute(WrappedComponent,hocProps){
    if(!!!WrappedComponent){
        throw new Error("缺少组件参数");
        return false;
    }
    //withRouter 也是一个高阶组件 传递 history
    return withRouter(
    class extends React.Component{
        constructor(props) {
          super(props);
        }

        componentWillMount(){
            let  isAuthenticated =  storage.getItem("token") ? true :false;
            this.setState({isAuthenticated:isAuthenticated})
            if(!isAuthenticated){
              const {history} = this.props;
              setTimeout(() => {
                history.replace("/login");
              }, 1000)
            }
        }

        render(){
            return this.state.isAuthenticated ?  (
                <WrappedComponent {...hocProps} />
            ) : ("请重新登录");
        }
    }
    )
}


export default withHocPrivateRoute;

使用:

...
import React from 'react';
import {BrowserRouter as Router , HashRouter ,  Route,Link,Switch ,withRouter} from 'react-router-dom';
import {syncHistoryWithStore} from 'react-router-redux'
import reducer from '../reducers/index.js';
import Home from 'container/Home.jsx';
import Login from 'container/Login.jsx';
import Regist from 'container/Regist';
//import PrivateRoute from 'component/common/PrivateRoute.jsx';
import HocPrivateRoute from 'component/common/HocPrivateRoute.jsx';
const  PrivateRoute =  HocPrivateRoute(Route);
...
<Switch>
<Route {...props} path="/login" component={Login} />
<Route {...props} path="/regist" component={Regist} />
<PrivateRoute  path="/home"  component={Home} />
<Route  {...props}  component={Login} />
</Switch>

总结:

细心的同学会发现,其实代码很相似,但是模式确实不一样。这也从侧门说明js function 和 class 本质是一样的。
喜欢的朋友给个赞!!!!

相关文章

  • react-router4.x 路由权限控制

    想必大家在使用react-router的时候,有的组件是需要登录才能访问的(private),有的是开放的(pub...

  • Vue权限控制

    需求 页面级别权限控制1.URL路由权限控制2.导航菜单权限控制3.超链接权限控制 元素界别权限控制1.按钮元素权...

  • 路由权限addroutes添加路由之后跳转不生效

    路有权限控制中,根据用户权限添加路由之后 next() 不生效问题

  • iOS捷径:AirRoute

    AirRoute 通过手机查看和控制路由,需要在路由上打开SSH远程控制权限。注:不是所有路由器都支持远程控制,支...

  • vue-router 路由权限控制

    vue项目开发中经常需要对路由进行权限控制,比如只有登录才能访问某个路由这里分享一个简单是路由登录权限设置 废话不...

  • 写一些关于vue的权限控制

    胡说八道一番 权限控制大概分为三种方式1.使用addRoutes动态添加路由,进行权限控制2.动态导航,控制入口,...

  • 元素级别的权限控制

    前端在权限控制这块主要应用的有两个,第一:页面权限,这个比较常见了,平时写的路由就是控制页面的权限,第二:元素级别...

  • Vue实战篇|使用路由管理用户权限(动态路由)

    权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些...

  • axios的用法

    动态路由的匹配 keep-alive在路由中的使用 meta的使用_控制权限 axios的基本使用 并发请求

  • 二、系统前端权限设计

    前端权限,即功能级权限,主要是路由的访问控制;页面上的具体功能展示以及页面上操作是否可用。 功能级权限: 1、先有...

网友评论

    本文标题:react-router4.x 路由权限控制

    本文链接:https://www.haomeiwen.com/subject/slluoxtx.html