三分钟实现一个react-router-dom5

import Login from “./page/login”;

export const Router = () => (

);

上面的 Router 组件,包含了三个页面:

  • 登陆

  • 主页

  • 404 页面

以及四个路由:

  • 根路由

  • 登陆路由

  • 主页路由

  • 404 路由

其中,根路由和 /home 路由,都定向到了主页路由。

以上是一个基本的路由定义,可以在登陆/主页和 404 页面之间来回跳转,但也有一些问题:

  • 非登陆状态下,可以直接跳转到主页

  • 登陆状态下,也可以输入 /login 路由跳转到登录页

现在,我们想完成这样的功能:

  • 非登陆状态下,无法直接跳转到主页,如果在非登陆状态下进行主页跳转,需要重定向至登陆路由

  • 登陆状态下,无法跳转至登录页,如果在登陆状态下进行登陆页跳转,需要重定向至主页路由

要完成这个功能,有两种方案:

  • 在每个组件中,根据 props 上的 history 对象来进行跳转

  • 进行全局的路由守卫处理

首先在跟目录src下创建一个routerMap.js文件,代码如下:

import Index from “./page/index”;

import Home from “./page/home”;

import ErrorPage from “./page/error”;

import Login from “./page/login”;

export default [

{ path: “/”, name: “App”, component: Index, auth: true },

{ path: “/home”, name: “Home”, component: Home, auth: true },

{ path: “/login”, name: “Login”, component: Login },

{ path: “/404”, name: “404”, component: ErrorPage },

];

将 auth 设置为 true,表示该路由需要权限校验。

然后,定义 Router 组件,在App.js中,该组件是经过高阶组件包装后的结果:

//App.js

import React, { Component } from “react”;

import { BrowserRouter as Router, Switch } from “react-router-dom”;

import FrontendAuth from “./FrontendAuth”;

import routerMap from “./routerMap”;

class App extends Component {

// eslint-disable-next-line no-useless-constructor

constructor(props) {

super(props);

}

render() {

return (

);

}

}

export default App;

所有的路由跳转,都交给 FrontendAuth 高阶组件代理完成。下面是 FrontendAuth 组件的实现:

import React, { Component } from “react”;

import { Route, Redirect } from “react-router-dom”;

class FrontendAuth extends Component {

// eslint-disable-next-line no-useless-constructor

constructor(props) {

super(props);

}

render() {

const { routerConfig, location } = this.props;

const { pathname } = location;

const isLogin = sessionStorage.getItem(“username”);

console.log(pathname, isLogin);

console.log(location);

// 如果该路由不用进行权限校验,登录状态下登陆页除外

// 因为登陆后,无法跳转到登陆页

// 这部分代码,是为了在非登陆状态下,访问不需要权限校验的路由

const targetRouterConfig = routerConfig.find(

(item) => item.path === pathname

);

console.log(targetRouterConfig);

if (targetRouterConfig && !targetRouterConfig.auth && !isLogin) {

const { component } = targetRouterConfig;

return ;

}

if (isLogin) {

// 如果是登陆状态,想要跳转到登陆,重定向到主页

if (pathname === “/login”) {

return ;

} else {

// 如果路由合法,就跳转到相应的路由

if (targetRouterConfig) {

return (

);

} else {

// 如果路由不合法,重定向到 404 页面

return ;

}

}

} else {

// 非登陆状态下,当路由合法时且需要权限校验时,跳转到登陆页面,要求登陆

if (targetRouterConfig && targetRouterConfig.auth) {

return ;

} else {

// 非登陆状态下,路由不合法时,重定向至 404

return ;

}

}

}

}

export default FrontendAuth;

创建登录的界面src/page/login.js,代码如下:

import React, { Component } from “react”;

import { Redirect } from “react-router-dom”; //重定向使用

class Login extends Component {

constructor(props) {

super(props);

this.state = {

username: “”,

password: “”,

rediectToReferrer: false, // 是否重定向之前的界面

};

this.handleChange = this.handleChange.bind(this);

this.handleSumit = this.handleSumit.bind(this);

}

// 处理用户名、密码的变化

handleChange(e) {

if (e.target.name === “username”) {

this.setState({

username: e.target.value,

});

} else if (e.target.name === “password”) {

this.setState({

password: e.target.value,

});

}

}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
[外链图片转存中…(img-4pPCxjEU-1715803759141)]

[外链图片转存中…(img-EmDUoxal-1715803759142)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值