Day-06
1.路由-是什么
- 路径和组件的映射关系
2.路由-为何用
单页面应用(SPA): 所有功能在一个html页面上实现
前端路由作用: 实现业务场景切换
优点:
-
整体不刷新页面,用户体验更好
-
数据传递容易, 开发效率高
缺点:
-
开发成本高(需要学习专门知识)
-
首次加载会比较慢一点。不利于seo
3.路由-vue-router介绍
官网: Vue Router
vue-router模块包
它和 Vue.js 深度集成
可以定义 - 视图表(映射规则)
模块化的
提供2个内置全局组件
声明式导航自动激活的 CSS class 的链接
4.Vue路由-组件分类
.vue文件本质无区别, 方便大家学习和理解, 总结的一个经验
src/views(或pages) 文件夹 和 src/components文件夹
-
页面组件 - 页面展示 - 配合路由用
-
复用组件 - 展示数据/常用于复用
5.Vue路由-vue-router使用
6.Vue路由-声明式导航-跳转
-
vue-router提供了一个全局组件 router-link
-
router-link实质上最终会渲染成a链接 to属性等价于提供 href属性(to无需#)
-
router-link提供了声明式导航高亮的功能(自带类名)
7.Vue路由-声明式导航-传参
在router-link上的to属性传值, 语法格式如下
-
/path?参数名=值
-
/path/值 – 需要路由对象提前配置 path: “/path/参数名”
对应页面组件接收传递过来的值
-
$route.query.参数名
-
$route.params.参数名
-
创建components/Part.vue - 准备接收路由上传递的参数和值
2.路由定义
3.导航跳转, 传值给MyGoods.vue组件
总结:
?key=value 用$route.query.key 取值
/值 提前在路由规则/path/:key 用$route.params.key 取值
8.Vue路由-重定向
-
网页打开url默认hash值是/路径
-
redirect是设置要重定向到哪个路由路径
例如: 网页默认打开, 匹配路由"/", 强制切换到"/find"上
9.Vue路由-404页面
默认给一个404页面
语法: 路由最后, path匹配*(任意路径) – 前面不匹配就命中最后这个, 显示对应组件页面
10.Vue路由-模式设置
hash路由例如: http://localhost:8080/#/home
history路由例如: http://localhost:8080/home (以后上线需要服务器端支持, 否则找的是文件夹)
11.Vue路由-编程式导航-跳转
12.Vue路由-编程式导航-传参
13.Vue路由-路由嵌套
router-view嵌套架构图
-
创建需要用的所有组件
src/views/Find.vue -- 发现音乐页
src/views/My.vue -- 我的音乐页
src/views/Second/Recommend.vue -- 发现音乐页 / 推荐页面
src/views/Second/Ranking.vue -- 发现音乐页 / 排行榜页面
src/views/Second/SongList.vue -- 发现音乐页 / 歌单页面
-
main.js– 继续配置2级路由
一级路由path从/开始定义
二级路由往后path直接写名字, 无需/开头
嵌套路由在上级路由的children数组里编写路由信息对象
-
说明:
App.vue的router-view负责发现音乐和我的音乐页面, 切换
Find.vue的的router-view负责发现音乐下的, 三个页面, 切换
-
说明:
-
App.vue, 外层的router-view负责发现音乐和我的音乐页面切换
-
Find.vue 内层的router-view负责发现音乐下的子tab对应的组件切换
-
运行 - 点击导航观察嵌套路由在哪里展示
总结: 嵌套路由, 找准在哪个页面里写router-view和对应规则里写children
14.Vue路由-声明式导航-类名区别
观察路由嵌套导航的样式
-
router-link-exact-active (精确匹配) url中hash值路径, 与href属性值完全相同, 设置此类名
-
router-link-active (模糊匹配) url中hash值, 包含href属性值这个路径
15.Vue路由-全局前置守卫
使用例子: 在跳转路由前, 判断用户登陆了才能去<我的音乐>页面, 未登录弹窗提示回到发现音乐页面
-
在路由对象上使用固定方法beforeEach
16.Vue路由-组件缓存
-
给3个子组件添加created和destroyed方法
-
测试切换效果
// 问题1. 路由切换时, 消失的页面, 会被销毁, 触发destroyed // 问题2. 再切换回来, 重新创建, 所有代码重新执行, 效率不高
-
给router-view外面包裹Vue自带的keep-alive标签即可
-
组件缓存是把相关信息存储在内存中
-
再次测试
17.Vue路由-组件缓存-匹配缓存
需求: 只缓存<发现音乐>页面
-
需要先给要区分的组件们, 设置name字段和值
2.在keep-alive的时候, 使用include/exclude区分即可
-
include 包含哪些组件名需要缓存
exclude ==不==缓存哪些名字的组件
千万注意: exclude后面字符串逗号后面不能有空格
18.Vue路由-组件缓存-新钩子函数
组件不执行销毁/初始化创建的方法了, 如何知道组件被失去激活/激活呢?
-
activated --- 组件被激活状态
-
deactivated --- 组件被失去激活状态
总结
1. 路由之间是怎么跳转的?有哪些方式
1、<router-link to="需要跳转到页面的路径">
2、this.$router.push()跳转到指定的url,并在history中添加记录,点击回退返回到上一个页面
3、this.$router.replace()跳转到指定的url,但是history中不会添加记录,点击回退到上上个页面
4、this.$touter.go(n)向前或者后跳转n个页面,n可以是正数也可以是负数
2. vue-router怎么配置路由
在vue中配置路由分为5个步骤,分别是:
-
引入vue-router.js
-
配置路由path和组件, 和生成路由对象
-
把路由对象配置到new Vue中router选项下
-
页面使用<router-view></router-view> 承载路由
-
<router-link to="要跳转的路径"></router-link> 设置路由导航(声明式导航方式/编程式跳转)
3. vue-router的钩子函数都有哪些
关于vue-router中的钩子函数主要分为3类
全局钩子函数要包含beforeEach
beforeEach函数有三个参数,分别是:
to:router即将进入的路由对象 from:当前导航即将离开的路由 next:function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的)否则为false,终止导航。
单独路由独享组件
beforeEnter,
组件内钩子
beforeRouterEnter, beforeRouterUpdate, beforeRouterLeave
4. 路由传值的方式有哪几种
Vue-router传参可以分为两大类,分别是编程式的导航 router.push和声明式的导航
router.push
字符串:直接传递路由地址,但是不能传递参数
this.$router.push("home")
对象:
命名路由 这种方式传递参数,目标页面刷新会报错 - name+params
this.$router.push({name:"news",params:{userId:123})
查询参数 和path配对的是query
this.$router.push({path:"/news',query:{uersId:123})
接收参数 this.$route.query
声明式导航
字符串 <router-link to:"news"></router-link>
命名路由 <router-link :to:"{name:'news',params:{userid:1111}}"></route-link>
还可以to="/path/值" - 需要提前在路由 规则里值 /path/:key
查询参数 <router-link :to="{path:'/news',query:{userId:1111}}"></router-link>
还可以to="/path?key=value
5. 怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
动态路由指的就是path路径上传智, 前提需要路由规则了提前配置/path/:key名, 可以写多个用/隔开, 获取使用$route.params.key名来提取对应用路径传过来的值
6. Vue的路由实现模式:hash模式和history模式(必会)
hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用 window.location.hash 读取。特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。
history模式:history采用HTML5的新特性;且提供了两个新方法: pushState(), replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更
7. 请说出路由配置项常用的属性及作用(必会)
路由配置参数:
path : 跳转路径 component : 路径相对于的组件 name:命名路由 children:子路由的配置参数(路由嵌套) props:路由解耦 redirect : 重定向路由
8. 编程式导航使用的方法以及常用的方法(必会)
路由跳转 : this.$router.push() 路由替换 : this.$router.replace() 后退: this.$router.back() 前进 :this.$router.forward()
9. Vue如何去除URL中的#(必会)
vue-router 默认使用 hash 模式,所以在路由加载的时候,项目中的 URL 会自带 “#”。如果不想使用 “#”, 可以使用 vue-router 的另一种模式 history:new Router ({ mode : 'history', routes: [ ]})
需要注意的是,当我们启用 history 模式的时候,由于我们的项目是一个单页面应用,所以在路由跳转的时候,就会出现访问不到静态资源而出现 “404” 的情况,这时候就需要服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 “index.html” 页面。
10. 说一下你在vue中踩过的坑(必会)
1、第一个是给对象添加属性的时候,直接通过给data里面的对象添加属性然后赋值,新添加的属性不是响应式的
【解决办法】通过Vue.set(对象,属性,值)这种方式就可以达到,对象新添加的属性是响应式的
2、 在created操作dom的时候,是报错的,获取不到dom,这个时候实例vue实例没有挂载
【解决办法】通过:Vue.nextTick(回调函数进行获取)
11. $route和$router的区别?
$route是路由信息对象,包括‘path,hash,query,fullPath,matched,name’等路由信息参数; $router是路由实例对象,包括了路由的跳转方法,实例对象等
12. 跟keep-alive有关的生命周期是哪些?(必会)
1**)前言:**在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件keep-alive来缓存组件内部状态,避免重新渲染,在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件keep-alive来缓存组件内部状态,避免重新渲染
2**)生命周期函数:**在被keep-alive包含的组件/路由中,会多出两个生命周期的钩子:activated 与 deactivated。
1**、activated钩子:**在在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。
2**、Activated钩子调用时机:** 第一次进入缓存路由/组件,在mounted后面,beforeRouteEnter守卫传给 next 的回调函数之前调用,并且给因为组件被缓存了,再次进入缓存路由、组件时,不会触发这些钩子函数,beforeCreate created beforeMount mounted 都不会触发
1**、deactivated钩子:**组件被停用(离开路由)时调用。
2**、deactivated钩子调用时机**:使用keep-alive就不会调用beforeDestroy(组件销毁前钩子)和destroyed(组件销毁),因为组件没被销毁,被缓存起来了,这个钩子可以看作beforeDestroy的替代,如果你缓存了组件,要在组件销毁的的时候做一些事情,可以放在这个钩子里,组件内的离开当前路由钩子beforeRouteLeave => 路由前置守卫 beforeEach =>全局后置钩子afterEach => deactivated 离开缓存组件 => activated 进入缓存组件(如果你进入的也是缓存路由)