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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
[外链图片转存中…(img-4pPCxjEU-1715803759141)]
[外链图片转存中…(img-EmDUoxal-1715803759142)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!