React 小白,错误之处,请指明。
本文章借鉴多篇 React 路由的写法,抄袭在所难免。
主要是记录个人的成长历程。
如果帮到您了,不妨点赞支持。
react-router-dom
。npm install react-router-dom
/src
目录下创建 router
文件夹/src/router
目录下创建 FrontendAuth.jsx
、index.jsx
、router.config.js
打开 router.config.js
,
// 我们定义一个项为:
{
name?: String,
path: String,
title?: String,
component?: any,
children?: Object,
auth?: Boolean
}
解析:
name -> 路由名
path -> 路由地址(必填)
title -> 浏览器标签标题
component -> 路由名
children -> 子路由
router.config.js
示例:// router.config.js
import Login from "../pages/User/Login";
import Admin from "../pages/Admin/index";
import ErrorPage from "../pages/errors/404";
import PageOne from "../pages/Test/PageOne";
import PageTwo from "../pages/Test/PageTwo";
export const routerConfig = [
{
name: "login",
path: "/login",
component: Login,
title: "用户登陆",
},
{ name: "404", path: "/404", component: ErrorPage },
{
name: "index",
path: "/index",
component: Admin,
auth: true,
children: [
{
name: "pageOne",
path: "/pageOne",
component: PageOne,
auth: true,
},
{
name: "pageTwo",
path: "/pageTwo",
component: PageTwo,
auth: true,
},
],
},
];
写 FrontendAuth.jsx
路由前置组件
<Route ... />;
进行跳转<Redirect ... />
进行重定向// FrontendAuth.jsx
import React from "react";
import { Route, Redirect } from "react-router-dom";
// 用于鉴定路由地址是否在配置中。
const findRouterNode = (config, path) => {
let item = null;
config.map((e) => {
if (item == null) {
if (e.path === path) {
item = e;
} else if (e.children) {
item = findRouterNode(e.children, path);
}
}
});
return item;
};
export class FrontendAuth extends React.Component {
render() {
const { location, config } = this.props;
const { pathname } = location;
const isLogin = true; //localStorage.getItem("__config_center_token");
// 如果该路由不用进行权限校验,登录状态下登陆页除外
// 因为登陆后,无法跳转到登陆页
// 这部分代码,是为了在非登陆状态下,访问不需要权限校验的路由
const targetRouterConfig = findRouterNode(config, pathname);
if (targetRouterConfig && !targetRouterConfig.auth && !isLogin) {
const { component } = targetRouterConfig;
return <Route exact path={pathname} component={component} />;
}
if (isLogin) {
// 如果是登陆状态,想要跳转到登陆,重定向到主页
if (pathname === "/login") {
return <Redirect to="/" />;
} else {
// 如果路由合法,就跳转到相应的路由
if (targetRouterConfig) {
document.title = targetRouterConfig.name;
return (
<Route
path={pathname}
component={targetRouterConfig.component}
/>
);
} else {
// 如果路由不合法,重定向到 404 页面
return <Redirect to="/404" />;
}
}
} else {
// 非登陆状态下,当路由合法时且需要权限校验时,跳转到登陆页面,要求登陆
if (targetRouterConfig && targetRouterConfig.auth) {
return <Redirect to="/login" />;
} else {
// 非登陆状态下,路由不合法时,重定向至 404
return <Redirect to="/404" />;
}
}
}
}
/src/router/index.jsx
二级路由
router.config
通过FrontendAuth
的 config
属性给前置路由组件。Menu
的location
属性传输给菜单组件App.jsx
的写法。App.jsx
的写法。App.jsx
的写法。// index.jsx
import React, { Component } from "react";
import { HashRouter, Switch, Route, Link } from "react-router-dom";
import { FrontendAuth } from "./FrontendAuth";
import { routerConfig } from "./router.config";
import Menu from "../components/menu/menu";
export class Router extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Menu location={this.props.location} />
<HashRouter>
<Switch>
<FrontendAuth config={routerConfig} />
</Switch>
</HashRouter>
</div>
);
}
}
/src/App.jsx
改造
import React, { useState } from "react";
import { Router } from "./router";
import { HashRouter, Switch, Route, Link } from "react-router-dom";
import Login from "./pages/User/Login";
export default class App extends React.Component {
render() {
return (
<div className="bg-pink-400 text-white h-screen w-screen">
<HashRouter>
<Switch>
<Route path="/login" component={Login} />
<Router />
</Switch>
</HashRouter>
</div>
);
}
}
有误请指出。谢谢指导
HashRouter
的方式实现路由的跳转。HashRouter
内拿到。(我也不知道对不对哈,没有用其他的方式)Switch
内,否则会被调用多次。(猜测,因为 switch 进行路由匹配,所以多次执行了,导致 Menu 多次执行。原文:https://www.cnblogs.com/RemMai/p/15013415.html