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
 })

就好!!!!!!!




相关文章
|
4月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
351 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
2月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
74 1
|
5月前
|
移动开发 资源调度 前端开发
介绍React路由模式
【8月更文挑战第10天】介绍React路由模式
69 12
|
2月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
43 2
React——路由Route
|
3月前
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
406 19
|
3月前
|
前端开发 网络架构
React 路由
10月更文挑战第11天
48 2
|
3月前
|
前端开发 JavaScript 网络架构
实现动态路由与状态管理的SPA——使用React Router与Redux
【10月更文挑战第1天】实现动态路由与状态管理的SPA——使用React Router与Redux
62 1
|
4月前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
78 4
React技术栈-React路由插件之自定义组件标签
|
4月前
|
前端开发 JavaScript
React配合axios请求拦截校验session,403跳转至登陆页面
React中使用axios进行请求拦截,通过自定义事件监听和响应拦截实现403状态码时的自动登录页面跳转。
142 2
|
4月前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
147 3