后台管理系统是前端永远绕不开的话题,无论技术怎么革新,检验技术最好的标准就是如何做好产品。如今的前端可谓是百花齐放,百家争鸣,甚至学不过来了!吐血~ 本节主要讲述如何使用react、react-router-dom封装侧边栏。
下载react-router-dom
yarn add react-router-dom
react-router-dom
: 基于
react-router
,加入了在浏览器运行环境下的一些功能:
-
Link
组件,会渲染一个
a
标签;
-
BrowserRouter
组件,使用
pushState
和
popState
事件构建路由;
-
HashRouter
组件,使用
window.location.hash
和
hashchange
事件构建路由。
-
react-router-native
: 基于
react-router
,类似
react-router-dom
,加入了
react-native
运行环境下的一些功能。
描述
:图例就是简单的后台管理系统模板,左侧的导航栏通过路由控制内容区域的显示。页面过于简单,后面会重新替换,见谅!项目的ui是基于antD。
-
新建views文件夹放置页面
-
在views下分模块放置各类页面(首页:home)
import React, { Component } from "react";
// layout组件
import LayoutAside from "./components/aside";
import LayoutHeader from "./components/header";
import ContainerMain from "../../components/containerMain/Index";
// css
import "./layout.scss";
// antD
import { Layout } from "antd";
const { Sider, Header, Content } = Layout;
export default class Index extends Component {
constructor(props) {
super(props);
this.state = {};
render() {
return (
<Layout className="layout-wrap">
<Header className="layout-header">
<LayoutHeader />
</Header>
<Layout>
<Sider className="layout-side">
<LayoutAside />
</Sider>
<Content className="layout-main">
<ContainerMain />
</Content>
</Layout>
</Layout>
描述:首页是由登录页面进来的。我们从外部引入三个组件LayoutAside、LayoutHeader、ContainerMain,分别展示侧边栏、头部、内容区。
import React, { Component } from "react";
//asideMenu
import AsideMenu from "../../../components/asideMenu/index";
export default class Aside extends Component {
constructor(props) {
super(props);
this.state = {};
render() {
return <AsideMenu />;
import React, { Component, Fragment } from "react";
//css
import "./aside.scss";
export default class Header extends Component {
constructor(prpos) {
super(prpos);
this.state = {};
render() {
return (
<Fragment>
<h1 className="logo">
<span>LOGO</span>
</Fragment>
import React, { Component, Fragment } from "react";
import { Switch } from "react-router-dom";
import User from "../../views/user/index";
import UserAdd from "../../views/user/Add";
//私有路由组件
//私有组件方法
import PrivateRouter from "../privateRouter/index";
export default class ContainerMain extends Component {
constructor(prpos) {
super(prpos);
this.state = {};
render() {
return (
<Fragment>
<Switch>
<PrivateRouter exact path="/home/user/list" component={User}></PrivateRouter>
<PrivateRouter exact path="/home/user/add" component={UserAdd}></PrivateRouter>
</Switch>
</Fragment>
描述:这个页面是根据路由来展示不同的页面,里面引入私有组件方法匹配路由。
import React from "react";
import { Route, Redirect } from "react-router-dom";
//获取token
import { getToken } from "../../utils/session";
const PrivateRouter = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={
(routePrpos) =>
getToken() ? <Component {...routePrpos} /> : <Redirect to="/" /> //判断token,是否重定向到登录页
export default PrivateRouter;
描述:这个私有组件是react-router-dom官方提供的,我们在这个方法中做了路由重定向,防止通过路径访问。
import React, { Component, Fragment } from "react";
import { Link } from "react-router-dom";
//antd
import { UserOutlined } from "@ant-design/icons";
import { Menu } from "antd";
import Router from "../../router/index";
const { SubMenu } = Menu;
export default class AsideMenu extends Component {
constructor(props) {
super(props);
this.state = {};
// 无子级菜单处理
renderMenu = ({ title, key }) => {
return (
<Menu.Item key={key}>
<Link to={key}>{title}</Link>
</Menu.Item>
// 子级判断处理(递归)
renderSubMenu = ({ title, key, child }) => {
return (
<SubMenu key={key} icon={<UserOutlined />} title={title}>
{child &&
child.map((item) => {
return item.child && item.child.length > 0
? this.renderSubMenu(item)
: this.renderMenu(item);
</SubMenu>
render() {
return (
<Fragment>
mode="inline"
defaultSelectedKeys={["1"]}
defaultOpenKeys={["sub1"]}
style={{ height: "100%", borderRight: 0 }}
theme="dark"
{Router &&
Router.map((firstItem) => {
return firstItem.child && firstItem.child.length > 0
? this.renderSubMenu(firstItem)
: this.renderMenu(firstItem);
</Menu>
</Fragment>
描述:LayoutAside组件中引入AsideMenu组件,AsideMenu组件主要是根据路由文件动态展示导航栏目录,其中renderMenu 、renderSubMenu这两个方法是最关键的,分别对应无子级菜单处理、子级判断处理(递归),然后再render函数中渲染,根据路由文件是否存在子路由来判断显示对应方法。
const router = [
title: "控制台",
icon: "home",
key: "/home",
title: "用户管理",
icon: "laptop",
key: "/home/user",
child: [
key: "/home/user/list",
title: "用户列表",
icon: "",
key: "/home/user/add",
title: "添加用户",
icon: "",
title: "部门管理",
icon: "bars",
key: "/home/navigation",
child: [
key: "/home/navigation/dropdown",
title: "部门列表",
icon: "",
key: "/home/navigation/menu",
title: "添加部门",
icon: "",
child: [
key: "/home/navigation/dropdown",
title: "部门列表",
icon: "",
key: "/home/navigation/menu",
title: "添加部门",
icon: "",
title: "职位管理",
icon: "edit",
key: "/home/entry",
child: [
key: "/home/entry/form/basic-form",
title: "职位列表",
icon: "",
key: "/home/entry/form/step-form",
title: "添加职位",
icon: "",
title: "请假",
icon: "info-circle-o",
key: "/home/about1",
title: "加班",
icon: "info-circle-o",
key: "/home/about",
export default router;
描述:统一放置路由地址的文件是以这样形式,判断是否有子路由是根据child判断的,所以这边修改要同时修改AsideMenu文件中的child判断。
App.js
import React, { Component } from "react";
import { Switch, Route, BrowserRouter } from "react-router-dom";
import "./app.scss";
// import Home from "./views/Home.js";
import Login from "./views/login/Index";
import Home from "./views/home/Index";
//私有组件
import PrivateRouter from "./components/privateRouter/index";
export default class App extends Component {
constructor(props) {
super(props);
this.state = {};
render() {
return (
<div className="title">
<BrowserRouter>
<Switch>
<Route exact render={() => <Login />} path="/" />
<PrivateRouter component={Home} path="/home" />
{/* <Route exact render={() => <Home />} path="/home" /> */}
</Switch>
</BrowserRouter>
描述:这是页面路由的入口文件,放置登录路由、以及首页路由。
gitHub地址,欢迎滴滴
前言后台管理系统是前端永远绕不开的话题,无论技术怎么革新,检验技术最好的标准就是如何做好产品。如今的前端可谓是百花齐放,百家争鸣,甚至学不过来了!吐血~ 本节主要讲述如何使用react、react-router-dom封装侧边栏。介绍下载react-router-domyarn add react-router-domreact-router-dom: 基于react-router,加入了在浏览器运行环境下的一些功能: Link组件,会渲染一个a标签; Browse..
React的侧面导航组件
react-sidenav被导出为es模块,因此您需要捆绑程序才能使用它。 它也是用Typescript编写的,因此也可以直接与Typescript项目一起使用。
React16.8
导航上下文
由于当前版本的react-sidenav没有任何固定的渲染模板,因此用户可以自由渲染Nav项目。 为了有条件地渲染项目,可以获取包含以下属性的上下文:
如果选择此导航项目
Nav的id(根据props.id)
pathId
路径ID,将为parentId
导航级别从1开始
isLeaf
如果为true,则此Nav没有子代
以下是有关如何使用它的示例。
const Item = ( ) => {
const context = Reac
import React, { PureComponent } from "react";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import Home1 from "./Home/Home1";
import Home2 from "./Home/Home2";
React Sidebar是React 0.14+的补充工具栏组件。 它具有以下功能:
侧边栏可以在主要内容上滑动,也可以停靠在其旁边。
启用触摸功能:像在本机移动应用程序上一样滑动以打开和关闭侧边栏。
易于与媒体查询结合使用,仅在屏幕宽度足够大时才显示侧边栏()。
在左侧和右侧均可使用。
微小大小:<2.5kB(已压缩)
麻省理工学院执照
React侧边栏的触摸交互模仿了实现材料设计规范的Android应用程序所支持的交互:
关闭侧边栏后,从屏幕左侧拖动将使侧边栏的右侧跟随您的手指。
打开侧边栏后,将手指滑过屏幕只会在侧边栏上滑动手指时影响到侧边栏。
在释放时,它会调用onSetOpen道具,如果工具条被拖的距离不是更dragToggleDistance道具。
注意:由于“滑动后退”功能,侧边栏触摸功能在IOS上不起作用。 因此,该功能已在
React Navigation介绍
React Navigation为React Native提供的路由管理库,利用该库可以很好的管理页面跳转,及导航栏的配置。利用该库可以实现普通的页面跳转,但是在涉及拦截器使用的时候,实现起来就比较麻烦。我们举例说明一下,假如我们程序有如下几个页面
|-- pages
|-- login.js 登录页面
|-- record.js 我的订单页面
大家应该都有所体会,我们在一般应用都有跨tab跳转的需求, 这就需要特别处理下路由,所以 下面是使用react-navigation作为路由组件的一种方式.
具体情境是: app分三大模块Home主页, Bill账单和Me我的, 对应三个tab. 现在需求是 Home push HomeTwo, HomeTwo push BillTwo, BillTwo 返回到 Bill账单首页.
方法如下:
首先选择路由结构, 选择使用最外层是StackNavigator, 然后包含3个TabNavigator和其他组件.
const Components = {
HomeTwo: { scree
RN项目之Navigation
react navigation地址:https://reactnavigation.org/
在任何一个项目都离不开路由、关于RN的路由总结以下几点
一、**基本**
首先安装基本模块npm install @react-navigation/native -S或yarn add @react-navigation/native
然后再安装npm install @react-navigation/stack
import { NavigationContainer } from '@react-navigation/native'
import React, { Component } from 'react';
import classNames from 'classnames';
require('./index.less')
const navArr = [
'推荐','JK','Lo','汉服','Coser','动漫','手绘','小说'
class HomePage extend..
这只能用路由跳,不想用路由还有一个办法,那就是把菜单栏复制到各个界面,这样不管到哪个界面都有菜单栏。。。哈哈哈开个玩笑,进入正题
这几天真的被路由给搞吐了,认认真真的改了一天 多,今天来到公司之后,我又重新梳理了一下,可能就是昨天脑子确实转不动了,今天就顺着就给搞出来了,那激动的心,颤抖的手,赶紧过来记录一下。主要是怕我以后再忘了。。这次真的进入正题
语言:react+ant design 编译器:VS code 环境:macOS Big Sur
这次主要涉及三个界面,看结...
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
创建路由组件:
const RouterComponent = () => {
return (
<Router>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/users/:id" component={Users} />
<Route path="*" component={NotFound} />
</Switch>
</Router>
注意其中:
- BrowserRouter负责监听浏览器的变化,并将对应url匹配到对应的Route
- Switch保证只会有一个Route匹配成功
- exact表示只有路径为"/"的时候,才会渲染Home组件
- 通过path='/users/:id'匹配路由参数:id
- path="*"渲染没有匹配到Route的NotFound组件
创建对应的组件:
const Home = () => <h2>Home</h2>;
const About = () => <h2>About</h2>;
const Contact = () => <h2>Contact</h2>;
const Users = ({ match }) => <h2>{match.params.id}</h2>;
const NotFound = () => <h2>Page not found</h2>;
最后通过RouterComponent的方式将路由放入整个App中:
function App() {
return (
<div className="App">
<RouterComponent />
export default App;
以上就是封装React路由的基本方式,您可以根据需要对其进行扩展。