React-router-dom实现全局路由登陆拦截

简介: React-router-dom实现全局路由登陆拦截

正文


任何问题的提出都是根据现实的问题需要,我做的项目由于页面很多,管理起来比较复杂,权限控制是必须有的,在网上也找了许多的文章,最后,经过不屑的努力实现了一个属于自己的权限控制的前端的操作流程,我们一起来看一看吧!!!

首先我们要定义自己的路由:


//登陆页的基本操作
import LoginMod from './../login/Signin'
//登陆的首页
//blog
import StartPage from './blog/StartPage'
import FileNotFound from './blog/FileNotFound'
import TechTalk from './blog/TechTalk'
import AboutAuthor from './blog/AboutAuthor'
import TechAritcle from './blog/TechAritcle'
import AboutSite from './blog/AboutSite'
import Album from './blog/Album'
import CommentSite from './blog/CommentSite'
//back
import PrivateZone from './back/PrivateZone'
import EditTopic from './back/EditTopic'
export default [
  { path: "/", name: "首页", component: StartPage},
  { path: "/tech-talk", name: "首页", component: TechTalk},
  { path: "/about-author", name: "作者", component: AboutAuthor},
  { path: "/about-site", name: "关于本站", component: AboutSite},
  { path: "/tech-article", name: "文章", component: TechAritcle},
  { path: "/album", name: "相册", component: Album},
  { path: "/comment-site", name: "留言板", component: CommentSite},
  { path: "/edit-topic", name: "编辑我们的文章", component: EditTopic,auth:true},
  { path: "/login", name: "登陆页的基本操作", component: LoginMod},
  { path: "/private-zone", name: "个人空间的首页", component: PrivateZone,auth:true},
]

之后,在我们在App.js里面定义我们的router,之前,我们要说一下,我们使用的是redux的store


const mapStateToProps = (state, ownProps) => {
  console.log("mapStateToProps",state)
  return { token: state.token }
}
export default connect(mapStateToProps)(App);


看一下我们的App.js


import React from 'react';
// import logo from './logo.svg';
import './App.css';
import { BrowserRouter as Router,Route,Switch,Link,Redirect, withRouter} from "react-router-dom";
import { connect, Provider } from 'react-redux'
import Routers from './router/routers'
import FileNotFound from './router/blog/FileNotFound'
import zhCN from 'antd/es/locale/zh_CN';
import { ConfigProvider } from 'antd';
import { FetchDoGet } from './commons/Utils';
import store from './store/store'
class App extends React.Component{
  constructor(props){
    super(props)
    this.state={
    }
  }
  componentDidMount(){
  }
  render(){
    let token = this.props.token
    return(
      <ConfigProvider locale={zhCN}>
        <Router>
          <div>
            <Switch>
              {Routers.map((item,index)=>{
              return (
                <Route key={index} 
                path={item.path} 
                exact 
                render={(props) =>{
                  console.log("props",props)
                  return (!item.auth ? (<item.component {...props} />) : (token ? <item.component {...props} /> :
                    <Redirect to={{
                   pathname: '/login',
                   state: { from: props.location }
                   }} />)
                  )
                }
                }/>
               )//end Route
              })}
            // 所有错误路由跳转页面
            <Route component={FileNotFound} />
           </Switch>
        </div>            
        </Router>
      </ConfigProvider>
    )
  }
}
const mapStateToProps = (state, ownProps) => {
  console.log("mapStateToProps",state)
  return { token: state.token }
}
export default connect(mapStateToProps)(App);


上面的代码是至关重要的,我们利用switch,来定义我们的路由操作,当我们的token没有时,就会自动的跳转到我们的登陆页,这样也就是实现了我们的实现全局路由登陆拦截

自定义的store:


export function createStore(initialState) {
    let state = initialState;
    const listeners = [];
    function setState(partial) {
     state = {
      ...state,
      ...partial,
     };
     for (let i = 0; i < listeners.length; i++) {
      listeners[i]();
     }
    }
    function getState() {
     return state;
    }
    function subscribe(listener) {
     listeners.push(listener);
     return function unsubscribe() {
      const index = listeners.indexOf(listener);
      listeners.splice(index, 1);
     };
    }
    return {
     setState,
     getState,
     subscribe,
    };
   }


在另一个文件中:


import {createStore} from './StoreUtils'
export default createStore({
    token:"sds"
})

在index.js里面定义:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { Provider } from 'react-redux';
import { BrowserRouter, Route } from 'react-router-dom';
import { createStore } from 'redux';
import store from './store/store'
//
// ReactDOM.render(<App />, document.getElementById('root'));
ReactDOM.render(
    <BrowserRouter>
      <Provider store={store}>
        <Route component={App} />
      </Provider>
    </BrowserRouter>, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

至此,我已经把所有的实现的代码都写出来了。

那么,还有一个重要啊的问题,如何管理我们的登陆的状态呢?

首先引入我们的store


import store from './store/store'


设置我们的值:


store.setState({
      token:null
 })

就好!!!!!!!




相关文章
|
8天前
|
前端开发 JavaScript
React和Vue实现路由懒加载
React和Vue实现路由懒加载
39 2
|
8天前
|
前端开发
如何使用react-router v6快速搭建路由?
如何使用react-router v6快速搭建路由?
61 0
|
8天前
|
存储 资源调度 前端开发
React原理 即 React路由基础
React原理 即 React路由基础
53 1
|
8天前
|
移动开发 前端开发 API
第三十二章 React路由组件的简单使用
第三十二章 React路由组件的简单使用
|
8天前
|
存储 前端开发 JavaScript
第三十章 React的路由基本使用
第三十章 React的路由基本使用
|
8天前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
53 0
|
8天前
|
前端开发 UED 开发者
react路由懒加载lazy直接使用组件标签引发的问题?
react路由懒加载lazy直接使用组件标签引发的问题?
173 0
|
8天前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
29 1
|
8天前
|
JavaScript 前端开发 网络安全
vue与react路由拦截
vue与react路由拦截
33 4
|
8天前
|
JavaScript 前端开发 小程序
react-router4.2使用js控制路由跳转的3种方式
react-router4.2使用js控制路由跳转的3种方式