Vue路由

184 阅读6分钟

路由基本概念和使用

基本概念

路由是URL路径和组件的一种映射关系

本质是一个由Vue官方提供的集成包,能够更方便的根据路径的不同来切换组件

使用

下包

yarn add vue-router

导包

main.js

import VueRouter from 'vue-router'

挂载

main.js

Vue.use(VueRouter)

导入路由组件

import component1 from '组件路径';
import component2 from '组件路径';
import component3 from '组件路径';
...

配置路由匹配规则

let routes = [
                {
                path:路径,
                component:组件名
            },
              {
                  path:路径,
                  component:组件名2
              },
    		{
                  path:路径,
                  component:组件名3
              },
             ]

创建路由实例并配置路由参数

main.js

let router = new VueRouter({
    routes(简写,原本为 routes:routes)
})

路由注入

new Vue({
    router
})

使用路由组件

VueRouter 提供给开发者两个组件
一个负责路由跳转的 router-link-to
一个负责显示跳转的 router-view

所以只需要在组件中直接嵌套使用 router-view

<router-view></router-view>

声明式导航

基本概念

声明式导航是 a 标签的一种上位替代,能够高亮被点击的元素,并且根据路由模式自动的映射地址

使用

<router-link  to="路由参数"></router-link>

注意:路由参数无需添加 # 号,区别 a 标签,router-link-to 会自动的添加 #

传参

因为路由的跳转是基于链接,那么是否可以通过路由链接来实现参数的传递?答案是肯定的,router 的设计者也实现了通过链接来传递参数的功能

查询参数传参

和 ajax 的网络请求一样,路径后面的 ?属性名=属性值&属性名2=属性值2&属性名3=属性名3... 也同样适用在 router 中

<router-link to="路由路径?属性=值&属性2=值2?属性3=值3..."

取值是通过 $route 对象来取值

this.$route.query.属性名
this.$route.quert.属性名2
this.$route.quert.属性名3
...

路由参数传参

区别与查询参数传参,路由参数需要提前在匹配规则中定义传参的属性名

routes:[{path:'路由路径/:属性名/:属性名2/:属性名3...',component:组件名}]

传参时通过路由参数传参

<router-link to="路由路径/值/值2/值3..."></router-link>

取值也同样通过 $route 对象来取值

this.$route.params.属性名
this.$route.params.属性名2
this.$route.params.属性名3
...

高亮模式

在 router-link-to 的路由链接被点击后,会给当前的链接选项添加两个类名,一个是 router-link-active ,另一个则是 router-link-exact-active

router-link-active

router-link-active 是一个模糊匹配后的产物,她会根据 location.hash 来匹配 to 属性的值,只要 location.hash 包含了 to 中的值,那么就会给点击的链接添加一个 router-link-active 属性

router-link-exact-active

router-link-exact-active 是精准匹配的产物,她会匹配 location.hash 和 to 的属性值,如果两者完全相等,则会向被点击的链接添加 router-link-exact-active ,否则不会添加改类名

作用

一般来说给链接高亮只用给 router-link-active 添加类名即可

编程式导航

基本概念

使用 js 来控制路由的跳转而不是使用 router-link-to 或者是 a 标签

使用

编程式导航需要配合 $router 对象来实现跳转

$router.push({
    path:'路由路径',
    name:'路由名'
})

一般来说只取 path 或者 name 来控制跳转

传参

编程式导航的传参和声明式传参类似,只是传递参数的方式不同

传参

$.router.push({
    path:'路由路径'name:'路由名',
    query:{
    	属性:值,
    	属性2:值2
    	属性3:值3
    	...
		},
    params:{
		属性:值,
         属性2:值2,
         属性3:值3
         ...
         }
})

注意:查询参数传参(query )在传递参数的时候会默认忽略掉 params 参数,并且 params 参数在接收的时候可以不用再写 "路由路径/:属性名/:属性名2:/属性名3"

推荐使用 name + params 或者 path + query ,其实 name + params 更好,因为参数不会显示在浏览器地址栏中

嵌套和守卫

嵌套

基本概念

多数情况下,路由的跳转也是存在有嵌套的,也就是常说的二级tab栏

使用

向父路由匹配规则中添加子路由匹配规则

main.js

routes:[
    {
    path:'父路由路径',
    component:父组件名,
    children:[
        {
            path:'子路由路径',
            component:子组件名
        }
        ]
    }
]

添加二级导航路由路径

<router-link to="父路由路径/子路由路径"></router-link>

注意:子路由在配置匹配规则的时候禁止添加 / 斜杠,router会自动的拼接二级路由路径

守卫

概念

在路由跳转的某一时刻自动调用的函数,就是守卫

全局前置守卫使用

全局前置守卫也就是在路由跳转之前调用的函数,这个函数能够对路由的跳转进行权限控制

main.js

const router = new VueRouter()

router.beforeEach(callback)

router.beforeEach函数接收一个回调函数作为参数

callback(to,from,next) {
    to   路由对象,去往哪里,也就是跳转目标路由
    from 路由对象,从哪里来,也就是跳转路由
    next 路由方法,必须调用的一个函数,用来对跳转进行操作,也是路由的控制方法
}

权限控制

守卫中的 next 方法能够对跳转进行控制,可以手动定义是否跳转目标路由,或者修改路由靶向

router.beforeEach((to,from,next)=>{
    next() 放行
    next(false) 禁止跳转
    next('路由路径') 修改路由跳转靶向
})

重定向与路由模式

重定向

定义

能够在路由跳转后进入默认的组件内一种操作方法

使用

routes:[
    {path:'/',redirect:'路由路径'}
]

在路由跳转到根路径的时候,会自动补全路径,并进入对应路径的组件页面

路由模式

决定是否在地址栏显示 # ,也就是路由链接的跳转方式是否携带 #

默认的路由模式是 hash 模式(携带 # ),可以手动修改为 history 模式(不携带 #)

new VueRouter({
    routes,
    mode:'history'
})

注意:history模式需要得到服务器的支持,因为链接的跳转如果不携带#,和请求方式相似,一定程度上会被浏览器认为是发起了请求,所以一定要确保服务器支持 history 的跳转模式

404组件

如果出现了未查找到的路由地址,需要提示用户路径错误,也就是需要添加一个新的匹配规则

routes:[
    {path:"*",component:NotFount}
]

注意,通配规则需要添加到匹配规则的末尾,路由的匹配规则是从数组的 0 下标开始到末尾下标依次命中,只要命中就会停止匹配,如果全部未匹配则会跳转到空白内容,所以只要在末尾添加统配匹配即可

组件缓存

定义

组件缓存是一种能够将组件写入内存而确保其不被销毁的技术

使用

基本使用

路由在跳转的时候会自动的将其销毁,在跳转回来的时候,也会自动的创建

<keep-alive>
	<router-view></router-view>
</keep-alive>

只需要将需要被保护的组件包裹在内即可

手动保护

设定被保护的组件

<keep-alive include="被保护的组件名"></keep-alive>

即只有被设定的组件会被保护,其他的组件都不会被保护

设定不被保护的组件

<keep-alive exclude="不被保护的组件名"></keep-alive>

即其他的组件都会被保护,只有被设定的组件不会被保护

缓存钩子

定义

是一种被缓存的组件被激活或者缓存的时候触发的声明周期函数

使用

激活钩子

当组件被激活的时候触发的钩子

export default{
    activated() {
        操作表达式
    }
}

缓存钩子

当组件被缓存的时候触发的钩子

export default {
    deactivated() {
        操作表达式
    }
}

注意:缓存钩子只对存在被缓存的组件生效,正常的组件(没有被 keep-alive 包裹)不会触发缓存钩子