Vue前端路由
一、路由的基本概念与原理
l路由是一个比价广义和抽象的概念、路由的本质就是对应关系
后端路由
- 概念:根据不同的用户URL请求,返回不同的内容
- 本质:URL请求地址与服务器资源之间的对应关系
前端路由
- 概念:根据不同的用户事件,显示不同的页面内容
- 本质:用户事件与事件处理函数之间的对应关系
Vue Router
是Vue.js官网的路由管理器,它和Vue.js的核心深度继承,可以非常方便的用于SPA应用程序的开发
Vue Router包含的功能
- 支持HTML5历史模式或hash模式
- 支持嵌套路由
- 支持路由参数
- 支持编程式路由
- 支持路由命名。。。
二、vue-router的基本使用
1、基本使用步骤
- 引入相关的库文件
- 添加路由链接
- 添加路由填充位
- 定义路由组件
- 配置路由规则并创建路由实例
- 把路由挂载到Vue根实例中
实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user">User</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
template: `<div>User组件</div>`
}
const Register = {
template: `<div>Register组件</div>`
}
/* 5、配置路由规则 */
const router = new VueRouter({
//所有的路由规则
routes:[
{path:'/user',component:User}, //这里的component不接收字符串
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 6、挂载路由实例对象 */
// router:router
router //当名字一致的时候可以简写
})
</script>
</body>
</html>
2、路由重定向
重定向指的是:用户在访问地址A的时候,强制用户跳转到C,从而展示特定的组件页面;通过路由规则的redirect属性,指定一个新的路由地址,可以很方便地设置路由的重定向
/* 5、配置路由规则 */
const router = new VueRouter({
//所有的路由规则
routes:[
//路由重定向 redirect
{path:'/',redirect:'/user'},
{path:'/user',component:User}, //这里的component不接收字符串
{path:'/register',component:Register}
]
})
三、vue-router嵌套路由
嵌套路由功能分析
- 点击父级路由链接显示模板内容
- 模板内容中又有子级路由链接
- 点击子级路由链接显示子级模板内容
使用实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user">User</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
template: `<div>User组件</div>`
}
const Register = {
template: `<div>
<h1>Register组件</h1><hr/>
<router-link to='/register/tab1'>tab1</router-link>
<router-link to='/register/tab2'>tab2</router-link>
<router-view />
</div>`
}
const Tab1 = {
template:'<h3>tab1子组件</h3>'
}
const Tab2 = {
template:'<h3>tab2子组件</h3>'
}
/* 5、配置路由规则 */
const router = new VueRouter({
//所有的路由规则
routes:[
{path:'/user',component:User}, //这里的component不接收字符串
/* 6、children,数组,配置子路由规则 */
{path:'/register',component:Register,children:[
{path:'/register/tab1',component:Tab1},
{path:'/register/tab2',component:Tab2}
]}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 7、挂载路由实例对象 */
// router:router
router //当名字一致的时候可以简写
})
</script>
</body>
</html>
四、vue-router动态路由匹配
思想?如果我们有很多的url地址,那是否需要为每一个url都定义一个组件呢?? 如果有几百几千个url呢?
1、动态匹配路由的基本用法
实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link to="/user/3">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
template: `<div>User组件---用户id为:{{$route.params.id}}</div>`
}
const Register = {
template: `<div>Register组件</div>`
}
/* 5、配置路由规则 */
const router = new VueRouter({
//动态路由匹配规则,以冒号开头
routes:[
{path:'/user/:id',component:User}, //这里的component不接收字符串
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 6、挂载路由实例对象 */
router
})
</script>
</body>
</html>
2、路由组件传递参数
$route与对应路由形成高度耦合,不够灵活,所有可以使用props将组件和路由解耦
props的值为布尔类型
props的值为对象类型
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link to="/user/3">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
props:['id','name','age'],
//注意:通过对象传参的方式,这里的id值是接收不到的
template: `<div>User组件---用户id为:{{id}}-----名字:{{name}}-----{{age}}</div>`
}
const Register = {
template: `<div>Register组件</div>`
}
/* 5、配置路由规则 */
const router = new VueRouter({
//动态路由匹配规则,以冒号开头
routes:[
{path:'/user/:id',component:User,props:{name:'pihao',age:18}}, //这里的component不接收字符串
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 6、挂载路由实例对象 */
router
})
</script>
</body>
</html>
props的值为函数类型
可以传一些静态数据
实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link to="/user/3">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
props:['id','name','age'],
//注意:通过对象传参的方式,这里的id值是接收不到的
template: `<div>User组件---用户id为:{{id}}-----名字:{{name}}-----年龄:{{age}}</div>`
}
const Register = {
template: `<div>Register组件</div>`
}
/* 5、配置路由规则 */
const router = new VueRouter({
//路由参数传递为一个 函数
routes:[
{path:'/user/:id',component:User,props:route =>({name:'pihao',age:18,id:route.params.id})}, //这里的component不接收字符串
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 6、挂载路由实例对象 */
router
})
</script>
</body>
</html>
五、vue-router命名路由
为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为“命名路由”。
实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 1、引入相关的库文件 -->
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 2、添加路由连接 -->
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<!-- 使用命名路由,to需要属性绑定: -->
<router-link :to="{name:'user',params:{id:3}}">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 3、添加路由占位符 -->
<router-view></router-view>
</div>
<script type="text/javascript">
/* 4、定义路由组件 */
const User = {
props:['id','name','age'],
//注意:通过对象传参的方式,这里的id值是接收不到的
template: `<div>User组件---用户id为:{{id}}-----名字:{{name}}-----年龄:{{age}}</div>`
}
const Register = {
template: `<div>Register组件</div>`
}
/* 5、配置路由规则 */
const router = new VueRouter({
//动态路由匹配规则,以冒号开头
routes:[
{
name:'user', //name,为路由命名
path:'/user/:id',
component:User,
props:route =>({name:'pihao',age:18,id:route.params.id})
},
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
/* 6、挂载路由实例对象 */
router
})
</script>
</body>
</html>
六、vue-router编程式导航
- 声明式导航:通过点击链接实现导航的方式,叫做声明式导航 ,常用的a标签
- 编程式导航:通过调用JavaScript形式的API实现导航的方式,叫做编程式导航,如:window.href()
1、编程式导航基本用法
常用的编程式导航API如下
-
this.$router.push(‘hash地址’)
-
this.$router.go(n) ,1表示前进一位,-1表示后退一位
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link :to="{name:'user',params:{id:3}}">User3</router-link>
<router-link to="/register">Register</router-link>
<router-view></router-view>
</div>
<script type="text/javascript">
const User = {
props:['id','name','age'],
template: `
<div>
User组件---用户id为:{{id}}-----名字:{{name}}-----年龄:{{age}}
<button @click = 'goRegister'>跳转到注册页面</button>
</div>
`,
methods:{
goRegister:function(){
this.$router.push('/register')
}
}
}
const Register = {
template: `
<div>
<h1>Register组件</h1>
<button @click = 'goBack'>后退</button>
</div>
`,
methods:{
goBack:function(){
this.$router.go(-1); //往后跳转一个页面
}
}
}
const router = new VueRouter({
routes:[
{
name:'user', //name,为路由命名
path:'/user/:id',
component:User,
props:route =>({name:'pihao',age:18,id:route.params.id})
},
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
router
})
</script>
</body>
</html>
2、编程式导航参数规则
router.push()方法的参数规则
实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/vue_2.5.22.js" type="text/javascript" charset="utf-8"></script>
<script src="js/vue-router_3.0.2.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link :to="{name:'user',params:{id:3}}">User3</router-link>
<router-link to="/register">Register</router-link>
<router-view></router-view>
</div>
<script type="text/javascript">
const User = {
props:['id','name','age'],
template: `
<div>
User组件---用户id为:{{id}}-----名字:{{name}}-----年龄:{{age}}
<button @click = 'goRegister'>跳转到注册页面</button>
</div>
`,
methods:{
goRegister:function(){
this.$router.push('/register')
}
}
}
const Register = {
template: `
<div>
<h1>Register组件</h1>
<button @click = 'goBack'>后退</button>
</div>
`,
methods:{
goBack:function(){
this.$router.go(-1); //往后跳转一个页面
}
}
}
const router = new VueRouter({
routes:[
{
name:'user', //name,为路由命名
path:'/user/:id',
component:User,
props:route =>({name:'pihao',age:18,id:route.params.id})
},
{path:'/register',component:Register}
]
})
const vm = new Vue({
el:'#app',
data:{
},
router
})
</script>
</body>
</html>
七、基于vue-router的案例
基于路由实现的综合案例,技术点分析
- 抽离并渲染App根组件
- 将左侧菜单路由链接
- 创建左侧菜单对应的路由组件
- 在右侧主体区域添加路由路由占位符
- 添加子路由规则
- 通过路由重定向默认渲染用户组件
- 渲染用户列表数据
- 编程式导航跳转到用户详情页面
- 实现返回上一页功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>基于vue-router的案例</title>
<style type="text/css">
html,
body,
#app {
margin: 0;
padding: 0px;
height: 100%;
}
.header {
height: 50px;
background-color: #545c64;
line-height: 50px;
text-align: center;
font-size: 24px;
color: #fff;
}
.footer {
height: 40px;
line-height: 40px;
background-color: #888;
position: absolute;
bottom: 0;
width: 100%;
text-align: center;
color: #fff;
}
.main {
display: flex;
position: absolute;
top: 50px;
bottom: 40px;
width: 100%;
}
.content {
flex: 1;
text-align: center;
height: 100%;
}
.left {
flex: 0 0 20%;
background-color: #545c64;
}
.left a {
color: white;
text-decoration: none;
}
.right {
margin: 5px;
}
.btns {
width: 100%;
height: 35px;
line-height: 35px;
background-color: #f5f5f5;
text-align: left;
padding-left: 10px;
box-sizing: border-box;
}
button {
height: 30px;
background-color: #ecf5ff;
border: 1px solid lightskyblue;
font-size: 12px;
padding: 0 20px;
}
.main-content {
margin-top: 10px;
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
ul li {
height: 45px;
line-height: 45px;
background-color: #a0a0a0;
color: #fff;
cursor: pointer;
border-bottom: 1px solid #fff;
}
table {
width: 100%;
border-collapse: collapse;
}
td,
th {
border: 1px solid #eee;
line-height: 35px;
font-size: 12px;
}
th {
background-color: #ddd;
}
</style>
<script src="./js/vue_2.5.22.js"></script>
<script src="./js/vue-router_3.0.2.js"></script>
</head>
<body>
<!-- 要被 vue 实例所控制的区域 -->
<div id="app">
<!-- 路由占位符 -->
<router-view></router-view>
</div>
<script>
/* 定义app的根组件内容 */
const App = {
template : `<div>
<!-- 头部区域 -->
<header class="header">在线发运后台管理系统</header>
<!-- 中间主体区域 -->
<div class="main">
<!-- 左侧菜单栏 -->
<div class="content left">
<ul>
<li><router-link to="/users">用户管理</router-link></li>
<li><router-link to="/rights">权限管理</router-link></li>
<li><router-link to="/goods">商品管理</router-link></li>
<li><router-link to="/orders">订单管理</router-link></li>
<li><router-link to="/settings">系统设置</router-link></li>
</ul>
</div>
<!-- 右侧内容区域 -->
<div class="content right"><div class="main-content">
<router-view/>
</div></div>
</div>
<!-- 尾部区域 -->
<footer class="footer">版权信息</footer>
</div>`
}
<!-- 定义相应的组件 -->
const Users = {
data(){
return {
userList:[
{id:1,name:'张三',age:10},
{id:2,name:'李四',age:20},
{id:3,name:'王五',age:30},
{id:4,name:'赵柳',age:40},
]
}
},
methods:{
goDetail(id){
console.log(id);
//将参数id传递过去
this.$router.push('/userInfo/'+id)
}
},
template:`<div>
<h3>用户管理区域</h3>
<table>
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>年龄</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for='(item,index) in userList' :key='item.id'>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.age}}</td>
<td>
<a href='#' @click.prevent='goDetail(item.id)'>查看详情</a>
</td>
</tr>
</tbody>
</table>
</div>`
}
<!-- 定义用户详情页面 -->
const userInfo = {
props:['id'],
methods:{
//实现后退功能
goBack(){
this.$router.go(-1);
}
},
template:`<div>
<h5>用户详情页面----用户id为:{{id}}</h5>
<button @click='goBack'>返回上一页</button>
</div>`
}
const Rights = {
template:`<div>
<h3>权限管理区域</h3>
</div>`
}
const Goods = {
template:`<div>
<h3>商品管理区域</h3>
</div>`
}
const Orders = {
template:`<div>
<h3>订单管理区域</h3>
</div>`
}
const Settings = {
template:`<div>
<h3>系统设置区域</h3>
</div>`
}
<!-- 创建路由对象 -->
const router = new VueRouter({
routes:[
{
path:'/',
component:App,
redirect:'/users',
children:[ //配置子路由
{path:'/users',component:Users},
{path:'/userInfo/:id',component:userInfo,props:true}, //详情页,参数传递开启
{path:'/rights',component:Rights},
{path:'/goods',component:Goods},
{path:'/orders',component:Orders},
{path:'/settings',component:Settings}
]
}
]
})
const vm = new Vue({
el:'#app',
router
})
</script>
</body>
</html>