VUE系统学习六
声明式导航-导航链接
1.需求
实现导航高亮效果

如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!!
2.解决方案
vue-router 提供了一个全局组件 router-link (取代 a 标签)
能跳转,配置 to 属性指定路径(必须) 。本质还是 a 标签 ,to 无需 #
能高亮,默认就会提供高亮类名,可以直接设置高亮样式
语法:
发现音乐
3.通过router-link自带的两个样式进行高亮
使用router-link跳转后,我们发现。当前点击的链接默认加了两个class的值 router-link-exact-active
和router-link-active
我们可以给任意一个class属性添加高亮样式即可实现功能
声明式导航-两个类名
当我们使用
1.router-link-active
模糊匹配(用的多)
to=”/my” 可以匹配 /my /my/a /my/b ….
只要是以/my开头的路径 都可以和 to=”/my”匹配到
2.router-link-exact-active
精确匹配
to=”/my” 仅可以匹配 /my
声明式导航-自定义类名(了解)
1.问题
router-link的两个高亮类名 太长了,我们希望能定制怎么办
2.解决方案
我们可以在创建路由对象时,额外配置两个配置项即可。 linkActiveClass
和linkExactActiveClass
1 | const router = new VueRouter({ |
3.代码演示
1 | // 创建了一个路由对象 |
声明式导航-查询参数传参
1.目标
在跳转路由时,进行传参
比如:现在我们在搜索页点击了热门搜索链接,跳转到详情页,需要把点击的内容带到详情页,改怎么办呢?
2.跳转传参
我们可以通过两种方式,在跳转的时候把所需要的参数传到其他页面中
- 查询参数传参
- 动态路由传参
3.查询参数传参
如何传参?
<router-link to="/path?参数名=值"></router-link>
如何接受参数
固定用法:
$router.query.参数名
4.代码演示
Home.vue
1 | <template> |
Search.vue
1 | <template> |
router/index.js
1 | import Home from '@/views/Home' |
main.js
1 | import Vue from 'vue' |
声明式导航-动态路由传参
1.动态路由传参方式
配置动态路由
动态路由后面的参数可以随便起名,但要有语义
1
2
3
4
5
6
7
8
9const router = new VueRouter({
routes: [
...,
{
path: '/search/:words',
component: Search
}
]
})配置导航链接
to="/path/参数值"
对应页面组件接受参数
$route.params.参数名
params后面的参数名要和动态路由配置的参数保持一致
2.查询参数传参 VS 动态路由传参
查询参数传参 (比较适合传多个参数)
- 跳转:to=”/path?参数名=值&参数名2=值”
- 获取:$route.query.参数名
动态路由传参 (优雅简洁,传单个参数比较方便)
- 配置动态路由:path: “/path/:参数名”
- 跳转:to=”/path/参数值”
- 获取:$route.params.参数名
注意:动态路由也可以传多个参数,但一般只传一个
动态路由参数的可选符(了解)
1.问题
配了路由 path:”/search/:words” 为什么按下面步骤操作,会未匹配到组件,显示空白?

2.原因
/search/:words 表示,必须要传参数。如果不传参数,也希望匹配,可以加个可选符”?”
1 | const router = new VueRouter({ |
Vue路由-重定向
1.问题
网页打开时, url 默认是 / 路径,未匹配到组件时,会出现空白

2.解决方案
重定向 → 匹配 / 后, 强制跳转 /home 路径
3.语法
1 | { path: 匹配路径, redirect: 重定向到的路径 }, |
4.代码演示
1 | const router = new VueRouter({ |
Vue路由-404
1.作用
当路径找不到匹配时,给个提示页面
2.位置
404的路由,虽然配置在任何一个位置都可以,但一般都配置在其他路由规则的最后面
3.语法
path: “*” (任意路径) – 前面不匹配就命中最后这个
1 | import NotFind from '@/views/NotFind' |
4.代码示例
NotFound.vue
1 | <template> |
router/index.js
1 | ... |
Vue路由-模式设置
1.问题
路由的路径看起来不自然, 有#,能否切成真正路径形式?
- hash路由(默认) 例如: http://localhost:8080/#/home
- history路由(常用) 例如: http://localhost:8080/home (以后上线需要服务器端支持,开发环境webpack给规避掉了history模式的问题)
2.语法
1 | const router = new VueRouter({ |
编程式导航-两种路由跳转方式
1.问题
点击按钮跳转如何实现?
2.方案
编程式导航:用JS代码来进行跳转
3.语法
两种语法:
- path 路径跳转 (简易方便)
- name 命名路由跳转 (适合 path 路径长的场景)
4.path路径跳转语法
特点:简易方便
1 | //简单写法 |
5.name命名路由跳转
特点:适合 path 路径长的场景
语法:
路由规则,必须配置name配置项
1
{ name: '路由名', path: '/path/xxx', component: XXX },
1
2
3
4
5
6
7
8
9//示例
const router = new VueRouter({
routes: [
{ path: '/', redirect: '/home' },
{ path: '/home', component: Home },
{ name: 'search', path: '/search/:words?', component: Search },
{ path: '*', component: NotFound }
]
})通过name来进行跳转
1
2
3this.$router.push({
name: '路由名'
})
编程式导航-path路径跳转传参
1.问题
点击搜索按钮,跳转需要把文本框中输入的内容传到下一个页面如何实现?
2.两种传参方式
1.查询参数
2.动态路由传参
3.传参
两种跳转方式,对于两种传参方式都支持:
① path 路径跳转传参
② name 命名路由跳转传参
4.path路径跳转传参(query传参)
1 | //简单写法 |
接受参数的方式依然是:$route.query.参数名
5.path路径跳转传参(动态路由传参)
1 | //简单写法 |
接受参数的方式依然是:$route.params.参数值
编程式导航-name命名路由传参
1.name 命名路由跳转传参 (query传参)
1 | this.$router.push({ |
2.name 命名路由跳转传参 (动态路由传参)
1 | this.$router.push({ |
3.总结
编程式导航,如何跳转传参?
1.path路径跳转
query传参
1
2
3
4
5
6
7
8this.$router.push('/路径?参数名1=参数值1&参数2=参数值2')
this.$router.push({
path: '/路径',
query: {
参数名1: '参数值1',
参数名2: '参数值2'
}
})动态路由传参
1
2
3
4this.$router.push('/路径/参数值')
this.$router.push({
path: '/路径/参数值'
})
2.name命名路由跳转
query传参
1
2
3
4
5
6
7this.$router.push({
name: '路由名字',
query: {
参数名1: '参数值1',
参数名2: '参数值2'
}
})动态路由传参 (需要配动态路由)
1
2
3
4
5
6this.$router.push({
name: '路由名字',
params: {
参数名: '参数值',
}
})
一级路由配置
针对router/index.js文件 进行一级路由配置
1 | ... |
嵌套路由配置
二级路由也叫嵌套路由,当然也可以嵌套三级、四级…
1.使用场景
当在页面中点击链接跳转,只是部分内容切换时,我们可以使用嵌套路由
2.语法
- 在一级路由下,配置children属性即可
- 配置二级路由的出口
1.在一级路由下,配置children属性
注意:一级的路由path 需要加 /
二级路由的path不需要加 /
1 | const router = new VueRouter({ |
2.配置二级路由的出口
注意: 配置了嵌套路由,一定配置对应的路由出口,否则不会渲染出对应的组件
router/index.js
1 | ... |
Layout.vue
1 | <template> |
缓存组件
1.问题
从面经列表 点到 详情页,又点返回,数据重新加载了 → 希望回到原来的位置
2.原因
当路由被跳转后,原来所看到的组件就被销毁了(会执行组件内的beforeDestroy和destroyed生命周期钩子),重新返回后组件又被重新创建了(会执行组件内的beforeCreate,created,beforeMount,Mounted生命周期钩子),所以数据被加载了
3.解决方案
利用keep-alive把原来的组件给缓存下来
4.什么是keep-alive
keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件中。
优点:
在组件切换过程中把切换出去的组件保留在内存中,防止重复渲染DOM,
减少加载时间及性能消耗,提高用户体验性。
App.vue
1 | <template> |
问题:
缓存了所有被切换的组件
5.keep-alive的三个属性
① include : 组件名数组,只有匹配的组件会被缓存
② exclude : 组件名数组,任何匹配的组件都不会被缓存
③ max : 最多可以缓存多少组件实例
App.vue
1 | <template> |
6.额外的两个生命周期钩子
keep-alive的使用会触发两个生命周期函数
activated 当组件被激活(使用)的时候触发 → 进入这个页面的时候触发
deactivated 当组件不被使用的时候触发 → 离开这个页面的时候触发
组件缓存后就不会执行组件的created, mounted, destroyed 等钩子了
所以其提供了actived 和deactived钩子,帮我们实现业务需求。