Vue 路由器
路由是是一种映射关系
Vue中的路由是,路径和组件的映射关系
单页面应用:所有的业务都在一个页面编写, 只有一个html
单页面应用好处:开发效率高, 用户体验好
单页面如何切换场景:依赖路由切换显示
路由-vue-router介绍
vue-router模块包
它和 Vue.js 深度集成
可以定义 - 视图表(映射规则)
模块化的
提供2个内置全局组件
声明式导航自动激活的 CSS class 的链接
Vue路由-组件分类
.vue文件分2类, 一个是页面组件, 一个是复用组件
src/views(或pages) 文件夹
页面组件 - 页面展示 - 配合路由用
src/components文件夹
复用组件 - 展示数据/常用于复用
Vue路由-vue-router使用
- 安装
yarn add vue-router@3.2.0
- 1: 导入路由
import VueRouter from 'vue-router'
- 2. 使用路由插件
在vue中,使用使用vue的插件,都需要调用Vue.use()
Vue.use(VueRouter)
- 3. 创建路由规则数组
const routes = [ { } ]
- 4. 根据路由规则数组 创建 路由对象
const router = new VueRouter({
routes // (缩写) 相当于 routes: routes
})
- 5. 关联到vue实例
路由展位符 最终路由组件需要被渲染
<router-view></router-view>
导入相关的组件
例子图:
Vue路由-声明式导航-跳转 router-link
- vue-router提供了一个全局组件 router-link
- router-link实质上最终会渲染成a链接 to属性等价于提供 href属性(to无需#)
- router-link提供了声明式导航高亮的功能(自带类名)
router-link是 :VueRouter在全局注册的组件, 本质就是a标签
router-link用法: 当标签使用, 必须传入to属性, 指定路由路径值
router-link好处:自带激活时的类名, 可以做高亮
Vue路由-声明式导航-传参
在router-link上的to属性传值, 语法格式如下
- /path?参数名=值
- /path/值 – 需要路由对象提前配置 path: “/path/参数名”
对应页面组件接收传递过来的值
- $route.query.参数名
- $route.params.参数名
Vue路由-重定向
- 网页打开url默认hash值是/路径
- redirect是设置要重定向到哪个路由路径
监测默认路由:规则里定义path: '/'
重定向路由路径:redirect配置项, 值为要强制切换的路由路径
Vue路由-404页面
没有找到页面默认给一个404页面
给路由体系里设置404页面:在数组最后一个位置, 插入匹配*的规则, 展示404页面
语法: {
path: '*' ,
component:组件名
}
Vue路由-模式设置
hash路由例如: http://localhost:8080/#/home
history路由例如: http://localhost:8080/home (以后上线需要服务器端支持, 否则找的是文件夹)
语法:mode: "history" // 打包上线后需要后台支持, 模式是hash
Vue路由-编程式导航-跳转
push 和 replace 区别 push 发生跳转有历史记录 replace没有历史记录
用JS代码来进行跳转
语法: this.$router.push({
path: "路由路径", // 都去 router/index.js定义. 路径前面不能加点
name: "路由名" // name 跳转需要在 规则数组里配置相同的值
})
Vue路由-编程式导航-传参
使用path 实现编程式导航 只能使用query 方法传递参数
使用 name 实现编程式导航 query|params 都可以传递参数
语法 :query / params 任选 一个
this.$router.push({
path: "路由路径"
name: "路由名",
query: {
"参数名": 值
}
params: {
"参数名": 值
}
})
对应路由接收 $route.params.参数名 取值
对应路由接收 $route.query.参数名 取值
声明式导航 a 标签实现跳转
编程式导航 一般都是 按钮形式 需要配合js代码 实现跳转
Vue路由-路由嵌套
二级路由配置 :
创建需要的二级页面组件
路由规则里children中配置二级路由规则对象
一级页面中设置router-view显示二级路由页面
二级路由注意点
二级路由path一般不写根路径
跳转时路径要从/开始写全
Vue路由-声明式导航-类名区别
自动添加的2个类名的区别
- router-link-exact-active (精确匹配) url中hash值路径, 与href属性值完全相同, 设置此类名
- router-link-active (模糊匹配) url中hash值, 包含href属性值这个路径
Vue路由-全局前置守卫❤️
路由跳转之前, 会触发一个函数
语法: router.beforeEach((to, from, next) =>{})
一定调next(), 才会跳转下一页
路由守卫
to 要去那个路由页面
from 来自那个路由页面
next()是一个函数 没有调用next() 函数表示不发生跳转
next('./index') 表示可以让其跳转到对应的路由
next(false)阻止跳转
// 路由守卫
// to 要去那个路由页面
// from 来自那个路由页面
// next()是一个函数 没有调用next() 函数表示不发生跳转
// next('./index') 表示可以让其跳转到对应的路由
// next(false)阻止跳转
const islogin = true
router.beforeEach((to,from,next)=>{
if(to.path === '/my' && islogin===false){
alert('请登录')
next(false)
} else{
// 放行
next()
}
})
Vue路由-组件缓存
路由页面切换时, 会执行生命周期方法:
消失: destroyed销毁流程
出现: created初始化流程 - 所有代码重新执行
缓存组件到内存里, 提升切换效率:
用keep-alive, 包裹切换的挂载点即可
Vue路由-组件缓存-匹配缓存
1. 需要先给要区分的组件们, 设置name字段和值
语法: export default {
name: '组件名'
}
2. 在keep-alive的时候, 使用include/exclude区分即可
(1) include 包含哪些组件名需要缓存
语法:<keep-alive include="Find">
<router-view></router-view>
</keep-alive>
(2) exclude ==不==缓存哪些名字的组件
语法:<keep-alive exclude="My,Part">
<router-view></router-view>
</keep-alive>
Vue路由-组件缓存-新钩子函数
activated --- 组件被激活状态
deactivated --- 组件被失去激活状态
activated () {
console.log("发现音乐-组件激活");
},
deactivated () {
console.log("发现音乐-组件失去激活");
}