Vue知识点总结(四)路由实例
该系列文章主要基于官方Vue教程,对Vue使用及特性等方面做一个较为系统的总结
路由实例创建
一般使用脚手架工具创建vue
实例的同时都会同步导入VueRouter
的npm
安装,如果需要单独导入,可使用npm
导入:
1 | npm install vue-router@4 |
这里同样提供CDN
链接:https://unpkg.com/vue-router@4.0.15/dist/vue-router.global.js
VueRouter
中router4
对应Vue3
,router3
对应Vue2
,故引包时需要格外看清VueRouter
的版本,@后跟随的就是版本号
在Vue中创建路由实例(router)
接下来分别讲一下在Vue2
和Vue3
中创建路由实例的方法
在Vue3
中使用createRouter api
进行路由实例创建
- 引包:npm install vue-router@4
- 引入:import {createRouter ,createMemoryHistory} from ‘vue-router’
- 安装注册并挂载:createAPP(App).use(router).mount(‘#app’)
- 创建路由对象:const router = createRoute({
history:createMemoryHistory
routes
})
1 | import { createMemoryHistory, createRouter } from 'vue-router' |
Vue2
中多了一步注入的步骤
- 引包:npm install vue-router@3.6.5(Vue2 为3.x Vue3为4.x)
- 引入:import VueRouter from ‘vue-router’
- 安装注册:Vue.use(VueRouter)
- 创建路由对象: const router = new VueRouter({ routes })
- 注入:new Vue({
render: h=>h(app)
router
}).$mount(‘#app’)
这里在介绍下用use()
注册为路由插件后实际上干了啥,首先是引入了RouterView
和RouterLink
两个组件,用于基本跳转,以及在选项式api
中加入了$router
和$route
实例,在组合式api
中加入了useRouter()
和useRoute()
函数,最后在使用mount()
将其挂载到Vue
当中去
路由规则创建(router配置项)
上述小节讲述了如何在Vue
中创建路由,这一小节讲讲如何创建匹配规则
可以看到在创建的router
中是可以添加配置项的,配置项以对象的形式添加
routes
routes
是路由的核心配置项,添加了路由导航的详细信息,routes
配置项是一个数组,每一个路由页面由一个对象组成,可以使用children
配置嵌套路由routes
配置项一览:
path
:定义路由路径component
:路由对应的组件name
:用来命名路由,传入名字对象添加参数属性来替代路径以做到命名路由redirect
:自定义重定向路径alias
:路由别名,路由别名定义的路径等同于path
中的路径children
:定义嵌套路由,规则等同于顶级路由meta
:路由元信息,用以将格外信息如标题等附加到路由上
示例:
1 | { |
在
Vue2
中可以使用this.$route
实例成员获取当前页面的路由信息,在Vue3
中使用useRoute()
函数获取路由信息
在最后配置path: "*"
用来匹配404
页面
activeLinks
通过配置linkActiveClass
和linkExactActveClass
配置项来修改对应导航激活时的类名
history模式
history
配置项允许我们在不同的历史模式中进行选择
hash
模式:在具体路径前添加一个#
,可以会对SEO
造成一定影响,配置createWebHashHistory()
Memory
模式:适合node
环境和SSR
,使用createMemoryHistory()
创建Html5
模式:最”正常”的模式,配置createWebHistory()
创建
路由懒加载
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效。
具体的做法是将组件的静态导入改为动态导入:
1 | // 将 |
路由匹配
在完成了路由的创建以及配置后,下一步就是如何在具体的页面中使用路由进行跳转,路由跳转的本质是往浏览器的历史记录中添加历史,然后通过在路由中push
完成跳转操作,本节将围绕push()
、<router-link>
以及<router-view>
展开
push()
是向浏览历史中添加一条记录,还有一种不添加记录的方式,就是replace()
方法,方法如其名,直接替换,不添加历史
路由出入口配置(RouterLink、RouterView)
在VueRouter
中使用RouterLink
替代html
中的<a>
,从而更好地兼容SPA
单页应用
在最初使用use()
注册路由之后,RouterLink
和RouterView
两个组件就相当于被全局注册了
在Vue
模板中使用RouterLink
大驼峰命名法和router-link
短横杠命名法都是被允许的,但是在html
的DOM
中则只能使用短横杠命名法(大驼峰是Vue3
后引入的规范,故对于早期版本也有可能会报错)
使用
<router-link>
设置跳转规则使用<router-view>
定位路由出口,即跳转后页面的显示位置1 | <router-link to="url"></router-link> |
配置路由出口:
<router-view></router-view>
路由匹配规则
路由router
使用push()
进行跳转,push()
被注册到路由实例中,Vue2
使用this.$router
访问,Vue3
中使用useRouter()
访问
下文中都将使用this.$router
和this.$route
进行演示,这和那两个函数方法作用上是完全一致的
动态路由匹配
在路由中可以配置动态路径参数将具有相同模式的路由进行分组,从而将具有相同规则的url
映射到同一个路由
路径参数为:
在使用<router-link>
进行路由跳转时,可以根据路径参数精确匹配
语法:
- 配置路由:
/path/:参数名
- 跳转:
to="/path/:id"
- 获取:
this.$route.params
查询参数匹配
使用查询参数可以为路由添加格外信息,相当于参数附加在基础路径上
语法:
- 跳转:
to="/url/?参数名1=值&参数名2=值"
- 获取:
this.$route.query.参数名
其他匹配方式
在使用路由时还有别的路由匹配的方法,比如可以使用正则式定义匹配或者使用hash
进行锚点匹配
this.$route
实例中提供了params
表示路径参数,query
表示查询规则,hash
表示hash
值
在路由跳转时也可以以用这些参数,以便更精确定位
1 | router.push({ |
router-link属性
<router-link>
组件中还可以添加一些属性,比如to
就是配置跳转路径,其余一些属性还可以配置其他内容
exact
:配置精确匹配,在<router-link>
中添加exact
后只有当路由精确匹配路径时才会是激活状态router-link-active
:模糊匹配状态下,对应导航激活时的默认样式类名router-link-exact-active
:精确匹配状态下,对应导航激活时的默认样式类名
在router
中可添加配置项linkActiveClass
和linkExactActiveClass
可以手动配置激活状态下的类名
路由守卫
路由守卫,用于在路由跳转的时候添加某些副作用,根据触发时机可以分为前置守卫或后置守卫,根据守卫范围可分为全局守卫或局部守卫
全局前置守卫
可以使用router.beforeEach()
创建一个全局前置守卫
语法:
1 | const router = createRouter({ ... }) |
参数:
to
:表示即将进入的目标from
:表示离开的对象
返回值:false
: 表示取消该次跳转{name:'routername'}
:表示重定向到目标路由none
:没有返回值表示路由是有效的
全局后置钩子
不同于前置守卫,后置钩子并不会改变导航本身,它们主要的用途是更改页面标题,分析页面信息等辅助功能
语法:
1 | router.afterEach((to, from) => { |
路由独享守卫
在具体路由配置项(routes
)中定义beforeEnter
配置项
该守卫只在进入该路由时触发,不会在params
、query
、hash
改变时触发,即只有跨越配置项时触发
定义语法:
1 | const routes = [ |
在嵌套路由中,如果路由独享守卫被定义在父级路由中,则子级路由间的跳转不会触发路由独享守卫
组件内路由守卫
可在具体组件内部定义组件内守卫,router
提供了三个组件内守卫的api
,分别是:
beforeRouteEnter
:在渲染组件前调用beforeRouteUpdate
:组件动态参数改变时调用beforeRouteLeave
:离开组件渲染时调用
在组合式api
中提供了onBeforeRouteUpdate()
和onBeforeRouteLeave()
分别添加update
和leave
守卫
路由守卫触发流程
- 导航触发
- 离开的组件触发
beforeRouteLeave
- 全局
beforeEach
守卫- 重用组件的
beforeRouteUpdate
- 独享配置项中的
beforeEnter
- 解析异步路由组件
- 进入的组件触发
beforeRouteEnter
- 导航确认
- 全局
afterEach
钩子- 触发
DOM
更新
不要在路由守卫中修改具体组件的DOM
,如果要做全局性判断,则在外层进行修改,否则在对应组件的生命周期内进行修改,任何路由守卫都不支持或者不建议直接操作导航对象的DOM