# 第六章 vue-router
# 相关理解
# vue-router的相关理解
vue 的一个插件库 ,专门用来实现 SPA 应用。
# 对 SPA 应用的理解
单页 Web 应用(single page web application ,SPA)。
整个应用只有一个完整的页面。
点击页面中的导航链接不会刷新页面 ,只会做页面的局部更新。
数据需要通过 ajax 请求获取
# 路由的理解
什么是路由
一个路由就是一组映射关系 (key - value)
key 为路径, value可能是 function或 component
路由分类
后端路由
1)理解:value是 function, 用于处理客户端提交的请求
2)工作过程 :服务器接收到一个请求时, 根据请求路径找到匹配的函数来处理请求, 返回响应数据。
前端路由
1)理解:value是component ,用于展示页面内容。
2) 工作过程 :当浏览器的路径改变时, 对应的组件就会显示。
# 基本路由
# 效果

# 总结
- 定义路由组件

- 注册路由
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'
2
3
4
5
- 使用路由
点击查看代码
// 该文件用于创建整个应用的路由器
import VueRouter from 'vue-router'
// 引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'
const router = new VueRouter({
mode: 'history',
routes: [
{
path: '/about',
component: About,
// 路由元信息
meta: {
title: '关于',
isAuth: false
}
},
{
name: 'home',
path: '/home',
component: Home,
meta: {
title: '首页',
isAuth: true
},
children: [
{
path: 'news',
component: News,
meta: {
title: '新闻'
},
// 独享路由守卫
beforeEnter: (to, from, next) => {
console.log('beforeEnter', '独享路由守卫')
if (localStorage.getItem('news')==='yes') {
next() //放行
} else {
alert('没有权限!')
}
}
},
{
path: 'message',
component: Message,
meta: {
title: '消息'
},
children: [
{
name: 'detail',
path: 'detail',
// path: 'detail/:id/:title', //使用占位符声明接收params参数
component: Detail,
// 路由props配置
//props的第一种写法:值为对象。该对象中的所有key-value都会以props的形式传给Detail组件。
//props: { a:1, b:'helle' }
//props的第二种写法:值为布尔值。若布尔值为真,就会把该路由组件收到的所有params参数以props的形式传给Detail组件
//props: true
//props的第二种写法:值为函数
props({ query: { id, title} }) { //$route.query => { query: { id, title} } 解构赋值的连续写法
return { id, title }
},
meta: {
title: '详情'
}
}
]
}
]
}
]
})
// 全局前置路由守卫(初始化的时候被调用、每次路由切换之前被调用)
/*router.beforeEach((to, from, next)=> {
console.log('beforeEach', '全局前置路由守卫')
if (to.meta.isAuth) {
if (to.name === 'home' && localStorage.getItem('home')==='yes') {
next() //放行
} else {
alert('没有权限!')
}
} else {
next() //放行
}
})*/
// 全局后置路由守卫(初始化的时候被调用、每次路由切换之后被调用),没有next
router.afterEach((to, from)=> {
console.log('afterEach', '全局后置路由守卫')
document.title = to.meta.title || '凹凸信息'
})
export default router
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 嵌套(多级)路由
# 效果

# 代码
点击查看代码
import VueRouter from 'vue-router'
const router = new VueRouter({
mode: 'history',
routes: [
{
name: 'home',
path: '/home',
component: Home,
meta: {
title: '首页',
isAuth: true
},
children: [
{
path: 'news',
component: News,
meta: {
title: '新闻'
},
// 独享路由守卫
beforeEnter: (to, from, next) => {
console.log('beforeEnter', '独享路由守卫')
if (localStorage.getItem('news')==='yes') {
next() //放行
} else {
alert('没有权限!')
}
}
},
{
path: 'message',
component: Message,
meta: {
title: '消息'
},
children: [
{
name: 'detail',
path: 'detail',
// path: 'detail/:id/:title', //使用占位符声明接收params参数
component: Detail,
// 路由props配置
//props的第一种写法:值为对象。该对象中的所有key-value都会以props的形式传给Detail组件。
//props: { a:1, b:'helle' }
//props的第二种写法:值为布尔值。若布尔值为真,就会把该路由组件收到的所有params参数以props的形式传给Detail组件
//props: true
//props的第二种写法:值为函数
props({ query: { id, title} }) { //$route.query => { query: { id, title} } 解构赋值的连续写法
return { id, title }
},
meta: {
title: '详情'
}
}
]
}
]
}
]
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 路由传参
# params传参(显示参数)
params传参(在地址栏可见),分为声明式和编程式。
声明式
router-link
通过router-linek
组件的to
属性实现,该方法的参数可以是一个字符串路径或者一个描述地址的对象,该方式传值的时候,需要子路由提前配置好参数:
// 子路由配置
{
path: '/news/:id',
component: News
}
// 父路由组件
<router-link :to="/news/1050">新闻</router-link>
2
3
4
5
6
7
编程式
this.$router.push
该方式传值的时候同样需要子路由提前配置好参数:
// 子路由配置
{
path: '/news/:id',
component: News
}
// 父路由组件
this.$router.push({
path: '/news/${id}'
})
2
3
4
5
6
7
8
9
在子路由中可以通过以下代码来获取参数的值:
// 注意:这里是this.$route 而不是this.$router
this.$route.params.id
2
# params传参(不显示参数)
params传参(不显示参数)也分为声明式和编程式,不同的是这里通过路由的别名name
进行传值。
声明式
router-link
该方式也通过router-link
组件的to
属性实现。
<router-link :to="{name:'News',params: {id:'1050'}}">新闻</router-link>
编程式
this.$router.push
使用该方式传值的时候,同样需要子路由提前配置好参数,不过不能再使用:id
来接收参数了,因为父路由中已经使用params
来携带参数了。
// 子路由配置
{
path: '/news',
name: 'News',
component: News
}
// 父路由组件
this.$router.push({
name: 'News'
params: { id: 1050 }
})
2
3
4
5
6
7
8
9
10
11
在子路由中可以通过以下代码来获取参数的值:
// 注意:这里是this.$route 而不是this.$router
this.$route.params.id
2
注意:上述这种利用 params
不显示 url
传参的方式会导致在刷新页面的时候,传递的值会丢失。
# query 传参(显示参数)
query
传参(显示参数)也可分为 声明式 和 编程式 两种方式。
声明式
router-link
该方式也是通过 router-link
组件的 to
属性实现,不过使用该方式传值的时候,需要子路由提前配置好路由别名(name
属性),例如:
// 子路由配置
{
path: '/news',
name: 'News',
component: News
}
// 父路由组件
<router-link :to="{name:'News',query: {id:'1050'}}">新闻</router-link>
2
3
4
5
6
7
8
编程式
this.$router.push
使用该方式传值的时候,同样需要子路由提前配置好路由别名(name
属性),例如:
// 子路由配置
{
path: '/news',
name: 'News',
component: News
}
// 父路由组件
this.$router.push({
name: 'News'
query: { id: 1050 }
})
2
3
4
5
6
7
8
9
10
11
在子路由中可以通过以下代码来获取参数的值:
// 注意:这里是this.$route 而不是this.$router
this.$route.query.id
2
# 编程式路由导航
相关API:
this.$router.push(path)
: 相当于点击路由链接(可以返回到当前路由界面)this.$router.replace(path)
: 用新路由替换当前路由(不可以返回到当前路由界面)this.$router.back()
请求(返回)上一个记录路由this.$router.go(-1)
: 请求(返回)上一个记录路由this.$router.go(1)
: 请求下一个记录路由
← 第五章 Vuex