react-router-dom 实现左侧导航
1、介绍react-router-dom
https://reacttraining.com/react-router/web/example/basic 这个官网有很多栗子可以练手
1.1 HashRouter 和BrowserRouter
HashRouter 只能有一个子节点
<HashRouter>
<div>
<ul>
<li>
<Link to="/main">Home1</Link>
</li>
<li>
<Link to="/about">About1</Link>
</li>
</ul>
</div>
</HashRouter>
http://localhost:3000/#/admin/buttons //HashRouter是根路由
http://localhost:3000/admin/buttons //BrowserRouter,主要用于前后端分离的时候使用
1.2 Route
exact={true}精确匹配
<Route exact={true} path="/" component={Home} />
<Route path="/common" render={() =>
<Common>
<Route path="/common/order/detail/:orderId" component={OrderDetail} />
</Common>
}
/>
1.3 Link 导航
<div>
<ul>
<li>
<Link to="/main">Home1</Link>
</li>
<li>
<Link to="/about">About1</Link>
</li>
</ul>
</div>
to 实现路由跳转
to还可传对象
<Link to={{pathname:'/three/7'}}>Three #7</Link> //一个基本的location对象
{pathname:'/',search:'',hash:'',key:'123',state:{}}
定义
<Route path="/three/:number" />
取值:
this.props.match.params.number
1.4 Switch 匹配多个路由
<Route path="/" render={()=>
<Admin>
<Switch>
<Route path='/home' component={Home} />
<Route path="/ui/buttons" component={Buttons} />
<Route path="/ui/modals" component={Modals} />
<Redirect to="/home" />、
</Switch>
</Admin>
} />
匹配到一个就不会往下执行
1.5 Redirect 路由重定向
<Redirect to="/home" />、
2、举栗子
2.1 简单例子
import React from 'react'
import {HashRouter , Route , Link, Switch} from 'react-router-dom'
import Main from './Main'
import About from './about'
import Topic from './topic'
export default class Home extends React.Component{ render(){
return (
<HashRouter>
<div>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/topics">Topics</Link>
</li>
</ul>
<hr/>
<Switch>
<Route exact={true} path="/" component={Main}></Route>
<Route path="/about" component={About}></Route>
<Route path="/topics" component={Topic}></Route>
</Switch>
</div>
</HashRouter>
);
}
}
2.2 嵌套子路由、获取动态路由、未匹配路由
Home.js
import React from 'react'
import { Link } from 'react-router-dom'
export default class Home extends React.Component { render() {
return (
<div>
<ul>
<li>
<Link to="/main">Home1</Link>
</li>
<li>
<Link to="/about">About1</Link>
</li>
<li>
<Link to="/topics">Topics1</Link>
</li>
<li>
<Link to="/mosquito1">mosquito1</Link>
</li>
<li>
<Link to="/mosquito2">mosquito2</Link>
</li>
</ul>
<hr />
{this.props.children}
</div>
);
}
}
router.js
import React from 'react'
import { HashRouter as Router, Route, Link, Switch} from 'react-router-dom'
import Main from './Main'
import Info from './info'
import About from './../route1/about'
import Topic from './../route1/topic'
import Home from './Home'
import NoMatch from './NoMatch'
export default class IRouter extends React.Component{ render(){
return (
<Router>
<Home>
<Switch>
<Route path="/main" render={() =>
<Main>
<Route path="/main/:value" component={Info}></Route>
</Main>
}></Route>
<Route path="/about" component={About}></Route>
<Route exact={true} path="/about/abc" component={About}></Route>
<Route path="/topics" component={Topic}></Route>
<Route component={NoMatch}></Route>
</Switch>
</Home>
</Router>
);
}
}
Main.js
import React from 'react'
import { Link } from 'react-router-dom'
export default class Main extends React.Component { render() {
return (
<div>
this is main page.
<br/>
<Link to="/main/test-id">嵌套路由1</Link>
<br/>
<Link to="/main/456">嵌套路由2</Link>
<hr/>
{this.props.children}
</div>
);
}
}
info.js
import React from 'react'
export default class Info extends React.Component { render() {
return (
<div>
这里是测试动态路由功能。
动态路由的值是:{this.props.match.params.value}
</div>
);
}
}
NoMatch.js
import React from 'react'
export default class Home extends React.Component { render() {
return (
<div>
404 No Pages.
</div>
);
}
}
注意:
<Home>
<Route path="/main" render={()=>
<Main>
<Route path="/main/a" component={About}></Route>
</Main>
}></Route>
<Route path="/about" component={About}></Route>
<Route path="/topics" component={Topic}></Route>
</Home>
1.render后的箭头函数不要加大括号,这样就不是返回了,而是执行里面的函数
2.有子路由的Route不能使用 exact={true} 精确匹配,不然子路由无法匹配
3.导入时可为HashRouter 取别名
import {HashRouter as Router,Route,LinK} from 'react-router-dom'
4.页面展示的内容通过 this.props.children
5.写动态子路由
<Route path="/main/:value" component={Info}></Route>
获取动态子路由
{this.props.match.params.value}
6.未匹配的路由
<Route component={NoMatch}></Route>
同时需要使用<Switch>标签,不然有子路由的算无法匹配而进入NoMatch组件
3、左侧导航栏
antd-design 有 Menu导航菜单,但是如果菜单栏的配置是后台给的话,需要遍历数据获取
首先配置router.js
<HashRouter>
<App>
<Switch>
<Route path="/login" component={Login}/>
<Route path="/common" render={() =>
<Common>
<Route path="/common/order/detail/:orderId" component={OrderDetail} />
</Common>
}
/>
<Route path="/" render={()=>
<Admin>
<Switch>
<Route path='/home' component={Home} />
<Route path="/ui/buttons" component={Buttons} />
<Route path="/ui/modals" component={Modals} />
<Route path="/ui/loadings" component={Loadings} />
<Route path="/ui/notification" component={Notice} />
<Route path="/ui/messages" component={Messages} />
<Route path="/ui/tabs" component={Tabs} />
<Route path="/ui/gallery" component={Gallery} />
<Route path="/ui/carousel" component={Carousel} />
<Route path="/form/login" component={FormLogin} />
<Route path="/form/reg" component={FormRegister} />
<Route path="/table/basic" component={BasicTable} />
<Route path="/table/high" component={HighTable} />
<Route path='/rich' component={Rich} />
<Route path="/city" component={City} />
<Route path="/order" component={Order} />
<Route path='/bikeMap' component={BikeMap} />
<Route path='/user' component={User} />
<Route path="/charts/bar" component={Bar} />
<Route path="/charts/pie" component={Pie} />
<Route path="/charts/line" component={Line} />
<Route path="/permission" component={Permission} />
<Redirect to="/home" />
{/* <Route component={NoMatch} /> */}
</Switch>
</Admin>
} />
</Switch>
</App>
</HashRouter>
menuConfig.js文件
const menuList = [
{
title: '首页',
key: '/home'
},
{
title: 'UI',
key: '/ui',
children: [
{
title: '按钮',
key: '/ui/buttons',
},
{
title: '弹框',
key: '/ui/modals',
},
{
title: 'Loading',
key: '/ui/loadings',
},
{
title: '通知提醒',
key: '/ui/notification',
},
{
title: '全局Message',
key: '/ui/messages',
},
{
title: 'Tab页签',
key: '/ui/tabs',
},
{
title: '图片画廊',
key: '/ui/gallery',
},
{
title: '轮播图',
key: '/ui/carousel',
}
]
},
{
title: '表单',
key: '/form',
children: [
{
title: '登录',
key: '/form/login',
},
{
title: '注册',
key: '/form/reg',
}
]
},
{
title: '表格',
key: '/table',
children: [
{
title: '基础表格',
key: '/table/basic',
},
{
title: '高级表格',
key: '/table/high',
}
]
},
{
title: '富文本',
key: '/rich'
},
{
title: '城市管理',
key: '/city'
},
{
title: '订单管理',
key: '/order',
btnList: [
{
title: '订单详情',
key: 'detail'
},
{
title: '结束订单',
key: 'finish'
}
]
},
{
title: '员工管理',
key: '/user'
},
{
title: '车辆地图',
key: '/bikeMap'
},
{
title: '图标',
key: '/charts',
children: [
{
title: '柱形图',
key: '/charts/bar'
},
{
title: '饼图',
key: '/charts/pie'
},
{
title: '折线图',
key: '/charts/line'
},
]
},
{
title: '权限设置',
key: '/permission'
},
];
export default menuList;
navleft.js
import React from "react";
import { Menu, Icon } from "antd";
import { NavLink } from "react-router-dom";
import MenuConfig from "./../../config/menuConfig";
import "./index.less";
const SubMenu = Menu.SubMenu;
export default class NavLeft extends React.Component { componentWillMount() {
const menuTreeNode = this.renderMenu(MenuConfig); this.setState({
menuTreeNode
});
}
// 菜单渲染
renderMenu = data => {
return data.map(item => {
if (item.children) {
return (
<SubMenu title={item.title} key={item.key}>
{this.renderMenu(item.children)}
</SubMenu>
);
}
return (
<Menu.Item title={item.title} key={item.key}>
<NavLink to={item.key}>{item.title}</NavLink>
</Menu.Item>
);
});
};
render() {
return (
<div>
<div className="logo">
<img src="/assets/logo-ant.svg" alt="" />
<h1>Imooc MS</h1>
</div>
<Menu onClick={this.handleClick} theme="dark">
{this.state.menuTreeNode}
</Menu>
</div>
);
}
}
navleft.less
.nav-left{
.logo{
line-height: 90px;
padding-left: 20px;
background-color: #002140;
img{
height: 35px;
}
h1{
color: #ffffff;
font-size: 20px;
display: inline-block;
vertical-align: middle;
margin: 0 0 0 10px;
}
}
}
admin.js
<Row className="container">
<Col span="4" className="nav-left">
<NavLeft/>
</Col>
<Col span="20" className="main">
<Header/>
<Row className="content">
{/* <Home/> */}
{this.props.children}
</Row>
<Footer/>
</Col>
</Row>
admin.less
.container{
.nav-left{
background-color:#001529;
color: #ffffff;
height: calc(100vh);
}
.main{
height: calc(100vh);
background-color: @colorL;
overflow: auto;
}
.content{
position: relative;
padding: 20px;
}
}
效果:
react-router-dom 实现左侧导航的更多相关文章
- React+Ant Design设置左侧菜单导航路由的显示与隐藏(与权限无关)
最近在学习react时,用到了很流行的UI框架Ant Design,也了解了一下Ant Design Pro,发现它们都有导航组件,Ant Design框架的导航菜单在这里,Ant Design Pr ...
- [转] React Router 使用教程
PS:react-route就是一个决定生成什么父子关系的组件,一般和layout结合起来,保证layout不行,内部的子html进行跳转 你会发现,它不是一个库,也不是一个框架,而是一个庞大的体系. ...
- React Router 4.x 开发,这些雷区我们都帮你踩过了
前言 在前端框架层出不穷的今天,React 以其虚拟 DOM .组件化开发思想等特性迅速占据了主流位置,成为前端开发工程师热衷的 Javascript 库.作为 React 体系中的重要组成部分:Re ...
- React Router教程
React Router教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-router-dom 应用于浏览 ...
- React Router API文档
React Router API文档 一.<BrowserRouter> 使用HTML5历史记录API(pushState,replaceState和popstate事件)的<Rou ...
- React Router学习
React Router教程 本教程引用马伦老师的的教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-ro ...
- React Router 4.0 体验
React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件.所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(声明式编 ...
- 十七、React路由嵌套:头部导航+侧边导航
一.概述 实现功能:点首页,展示首页,同时在左侧有个首页的各个栏目导航:点用户,同首页: 二.代码实现 1. src/App.js import React from 'react'; import ...
- React Router基础使用
React是个技术栈,单单使用React很难构建复杂的Web应用程序,很多情况下我们需要引入其他相关的技术 React Router是React的路由库,保持相关页面部件与URL间的同步 下面就来简单 ...
随机推荐
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- Magento2入门之修改logo
本文用于学习记录用 1.主题创建是在路径 /app/design/frontend/公司名/主题名称/ 我自己创建的路径为 app/design/frontend/Bman/castle,以下操作都在 ...
- js执行多次事件,而非一次
晚上查阅了很多文章,都是避免点击事件多次执行.反过来要是让事件多次执行该如何做? 这里可以配个setTimeout():来执行 这里我们用layui <link rel="styles ...
- python-day38(正式学习)
目录 线程 线程开启的两种方式 1 2 子线程和子进程的创建速度 子线程共享资源 线程的join方法 守护线程 线程其他用法 线程 线程开启的两种方式 1 from threading import ...
- Spring的事务传播机制实例 (转)
1,Propagation.REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.详细解释在代码下方. 实例 员工service @Service public ...
- 权限(rwx)对于目录与文件的意义
1-权限对于目录的意义 首先要明白的是目录主要的内容是记录文件名列表和子目录列表,而不是实际存放数据的地方. r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意 ...
- 06 Python之列表和元组
1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查操作 添加: 1 ...
- 3.1.2-arm-linux-ld选项
有文件link.S,内容如下 .text .global _start _start: b step1 step1: ldr pc, =step2 step2: b step2 经过如下命令编译 ar ...
- (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
在idea上怎么才能使用Spring的热部署 这里仅用Maven做介绍 (1)在Maven中添加依赖 (2)在插件配置 但是,为什么配置了还是没有用呢 ?! 这是因为idea默认是没有自动编译的,我们 ...
- LeetCode_Bit Manipulation
231. Power of Two Given an integer, write a function to determine if it is a power of two. class Sol ...