Vue.js - vue-router
Vue-Router
vue-router 学习比较系统全面,因此直接拿 vue 项目练习和讲解,此项目主要包含了 vue-router 的使用以及一些辅助的页面组件。
项目主要的结构如下(主要业务逻辑代码在src路径下):
1 |
|
vue-router
Part1: vue-router 安装及引用
Vue框架在安装的时候会提示开发者是否选择vue-router库,若选择则在项目生成过程中自动安装vue-router库,并提供相应的示例代码。若没有在项目初始化时安装vue-router,可以通过npm或yarn命令安装。
安装:npm install --save vue-router
引用:ES6 - import VueRouter from 'vue-router'
CommonJs - const VueRouter = require('vue-router')
注意:vue-router在开发和发布使用时均会使用,为了在package.json
中添加相应的依赖,安装时请务必加上--save
Vue-Router官方中文文档
Part2: vue-router 在项目目录结构中的存放位置
在Vue项目内,开发人员一般将业务逻辑写在/src
路径下,其中/components
主要用于存放项目组件,/views
存放整体页面视图,/assets
存放静态资源,/router
则主要存放路由配置。
注:项目结构内文件名并不是固定的,但是在行业内已经形成不成文规范,建议遵循此规范合理规划项目目录结构。
vue-router 文件夹路径:/src/router
vue-router 入口文件:/src/router/index.js
注:入口文件一般写为index.js
,这是因为 webpack 在编译文件路径时,默认可以省略 /index.js
以及 /node_modules
两个路径(可在webpack配置内更改)。因此引用vue-router时,一般简写为/src/router
即可。
Part3: vue-router的正式讲解
step1: 引用&插件注册&挂载
vue-router作为一个库,一个插件,在使用前必须被Vue项目引用和注册。
注:所有Vue插件在使用前都需要经过Vue.use()
注册安装
具体步骤如下:/src/router/index.js
路由入口文件下
- 引入 vue-router
Vue.use()
注册安装插件- 实例化路由 (常用参数有 routes, mode 等,属性名称均固定,不能随意设置)
- 导出路由
/src/index.js
项目入口文件下
- 引入创建的路由实例router
- 在Vue实例下挂载router路由实例
完整代码:
1 |
|
1 |
|
step2: 路由数组配置
我们已经有了一个router实例(有且只有一个),基础配置如下:
1 |
|
可以看到,配置参数中有一项 routes
,我们需要在里面配置路由和组件间的映射关系。
由于路由和组件的映射有多组,因此 routes
属性接收一个 Array
数组类型,本文后续将其称为路由数组。
路由数组往往包含了复杂的映射关系,我们一般将其单独声明一个变量存储,然后通过ES6字面量增强的写法配置到 router 实例中。
1 |
|
路由数组接收对象表示映射关系。
上述代码为基本的路由数组配置,包括了路由重定向以及路由和组件的映射:
路由和组件映射关系配置
常用属性(属性名Vue规定,不能随意更改):
- path: 路由相对路径。
'/'
表示根路径,一般为http://localhost:8080/
- component: 路由跳转的组件
- name: 路由标识名
1 |
|
路由重定向
路由重定向常用属性:
- path: 路由相对路径
- redirect: 路由重定向的目标路径
1 |
|
路由进阶配置——懒加载
路由懒加载
定义:实现了不同路由组件的分割,当路由被访问时才加载对应组件。
实现:当发生路由跳转时,调用箭头函数,触发import,导入文件,而非在index.js开始就import组件。
普通路由加载方式:在最开始就 import 组件
1 |
|
路由懒加载方式:当发生路由跳转时导入文件
1 |
|
路由懒加载管理
1 |
|
动态路由配置
在路由跳转过程中,我们往往需要传递某些信息给路由跳转后的组件。
动态路由配置可以让 url 携带一些配置参数进行传递,主要为 params
和 query
两种方式。
作用:路由切换时,传递参数。
params
动态路由配置:
1 |
|
params
参数接收:
params 传递的参数可通过挂载在 Vue 实例下的全局 route 的 params 属性获取:this.$route.parmas.id
query
动态路由配置:
query 配置路由时,不需要 /:xxx
预留位置,而是在 url 中添加 xxx=aaa&yyy=bbb
传递参数。
query 传参格式参考:
协议头://主机名:端口号?queryhttp://localhost:8080?name=wjt&age=18
1 |
|
query
参数接收:
query 传递的参数可通过挂载在 Vue 实例下的全局 route 的 query 属性获取:this.$route.query
获取的是对象类型,形如{name:'wjt',age:18}
嵌套路由配置
当路由跳转组件内还有路由和组件的映射关系时,需要在当前路由内配置嵌套路由。
1 |
|
嵌套路由配置同普通路由配置相同,唯一要注意的是嵌套路由在相应路由内通过children
属性配置,由于子路由也是路由,因此**children
属性接收的也是数组类型,数组内为子路由对象**。
导航守卫
导航守卫主要用于监听路由的创建/跳转等,并执行回调函数。类似于Vue的生命周期。
导航守卫根据作用域不同可以分为:
- 全局导航守卫
- 路由独享守卫
- 组件守卫
本文主要介绍全局导航守卫,让读者了解导航守卫大致的作用以及使用方式,具体细节以及其余守卫请参考Vue-Router官方文档。
全局导航守卫:作用于全局,内部又根据执行回调的节点不同分为前置守卫,后置守卫等等
前置守卫 (通过router实例的beforeEach()方法执行)xxx.beforeEach()
: 在路由跳转前自动执行自定义操作。(监听全局的路由跳转).beforeEach()
是 router 实例的方法,接收函数作为参数。其回调函数中又包含三个参数:
- to: 跳转的目的路由, 源码内 to 是 route 类型,取数据方法同 $route.xxx
- from: 跳转前的路由, 源码内 from 是 route 类型,取数据方法同 $route.xxx
- next: next(),必须要调用,否则不能执行下一步。
1 |
|
后置钩子(守卫).afterEach()
: 在路由跳转后自动执行自定义操作。(监听全局的路由跳转).afterEach()
是 router 实例的方法,接收函数作为参数。其回调函数中又包含两个参数:
- to: 跳转的目的路由, 源码内 to 是 route 类型,取数据方法同 $route.xxx
- from: 跳转前的路由, 源码内 from 是 route 类型,取数据方法同 $route.xxx
!!!注意 .afterEach() 没有next: 因为路由已经跳转完成,不需要进行其他操作,因此没有 next() 函数。
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!