Vue路由管理器Vue-router的使用方法详解


Posted in Javascript onFebruary 05, 2020

router-link

<router-link> 组件支持用户在具有路由功能的应用中点击导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属性生成别的标签。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名

<router-link> 比起写死的 <a href="..." rel="external nofollow" > 会好一些。无论是 HTML5 history 模式还是 hash 模式,它的表现行为一致,所以,当切换路由模式,或者在 IE9 降级使用 hash 模式,无须作任何变动;在 HTML5 history 模式下,router-link 会拦截点击事件,让浏览器不再重新加载页面;在 HTML5 history 模式下使用 base 选项之后,所有的 to 属性都不需要写基路径了

props

to(required)

类型 string | Location

表示目标路由的链接。当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象

<!-- 字符串 -->
 <router-link to="home">Home</router-link>
 <!-- 渲染结果 -->
 <a href="home" rel="external nofollow" >Home</a>
 <!-- 使用 v-bind 的 JS 表达式 -->
 <router-link v-bind:to="'home'">Home</router-link>
 <!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->
 <router-link :to="'home'">Home</router-link>
 <!-- 同上 -->
 <router-link :to="{ path: 'home' }">Home</router-link>
 <!-- 命名的路由 -->
 <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
 <!-- 带查询参数,下面的结果为 /register?plan=private -->
 <router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>

replace

类型: boolean

默认值: false

设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录

<router-link :to="{ path: '/abc'}" replace></router-link>

append

类型: boolean

默认值: false

设置 append 属性后,则在当前(相对)路径前添加基路径。例如,从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

<router-link :to="{ path: 'relative/path'}" append></router-link>

tag

类型: string

默认值: "a"

有时想要 <router-link> 渲染成某种标签,例如 <li>。 于是使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航

<router-link to="/foo" tag="li">foo</router-link>
 <!-- 渲染结果 -->
 <li>foo</li>

active-class

类型: string

默认值: "router-link-active"

设置链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置

exact

类型: boolean

默认值: false

是否激活默认类名的依据是 inclusive match (全包含匹配)。 举个例子,如果当前的路径是 /a 开头的,那么 <router-link to="/a"> 也会被设置 CSS 类名

按照这个规则,<router-link to="/"> 将会点亮各个路由。想要链接使用 "exact 匹配模式",则使用 exact 属性

<!-- 这个链接只会在地址为 / 的时候被激活 -->
 <router-link to="/" exact>

events

类型: string | Array<string>

默认值: 'click'

声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组

将"激活时的CSS类名"应用在外层元素

有时候要让 "激活时的CSS类名" 应用在外层元素,而不是 <a> 标签本身,那么可以用 <router-link> 渲染外层元素,包裹着内层的原生 <a> 标签:

<router-link tag="li" to="/foo">
 <a>/foo</a>
</router-link>

在这种情况下,<a> 将作为真实的链接(它会获得正确的 href 的),而 "激活时的CSS类名" 则设置到外层的 <li>

router-view

<router-view> 组件是一个 functional 组件,渲染路径匹配到的视图组件。<router-view> 渲染的组件还可以内嵌自己的 <router-view>,根据嵌套路径,渲染嵌套组件

属性

name

类型: string

默认值: "default"

如果 <router-view>设置了名称,则会渲染对应的路由配置中 components 下的相应组件

行为表现

其他属性(非 router-view 使用的属性)都直接传给渲染的组件, 很多时候,每个路由的数据都是包含在路由参数中。

因为它也是个组件,所以可以配合 <transition> 和 <keep-alive> 使用。如果两个结合一起用,要确保在内层使用 <keep-alive>:

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

路由信息对象

一个 route object(路由信息对象) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的 route records(路由记录)

route object 是 immutable(不可变) 的,每次成功的导航后都会产生一个新的对象。route object 出现在多个地方,包括如下

1、组件内的 this.$route 和 $route watcher 回调(监测变化处理)

2、router.match(location) 的返回值

3、导航钩子的参数

router.beforeEach((to, from, next) => {
 // to 和 from 都是 路由信息对象
})

4、scrollBehavior 方法的参数

const router = new VueRouter({
 scrollBehavior (to, from, savedPosition) {
  // to 和 from 都是 路由信息对象
 }
})

属性

$route.path

类型: string

字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"

$route.params

类型: Object

一个 key/value 对象,包含了 动态片段 和 全匹配片段,如果没有路由参数,就是一个空对象

$route.query

类型: Object

一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有 $route.query.user = 1,如果没有查询参数,则是个空对象

$rout.hash

类型: string

当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串

$route.fullPath

类型: string

完成解析后的 URL,包含查询参数和 hash 的完整路径

$route.matched

类型: Array<RouteRecord>

一个数组,包含当前路由的所有嵌套路径片段的 路由记录 。路由记录就是 routes 配置数组中的对象副本(还有在 children 数组)

const router = new VueRouter({
 routes: [
  // 下面的对象就是 route record
  { path: '/foo', component: Foo,
   children: [
    // 这也是个 route record
    { path: 'bar', component: Bar }
   ]
  }
 ]
})

当 URL 为 /foo/bar,$route.matched 将会是一个包含从上到下的所有对象(副本)

$route.name

当前路由的名称,如果有的话

Router构造配置

routes

类型: Array<RouteConfig>

RouteConfig 的类型定义:

declare type RouteConfig = {
 path: string;
 component?: Component;
 name?: string; // for named routes (命名路由)
 components?: { [name: string]: Component }; // for named views (命名视图组件)
 redirect?: string | Location | Function;
 alias?: string | Array<string>;
 children?: Array<RouteConfig>; // for nested routes (嵌套路由)
 beforeEnter?: (to: Route, from: Route, next: Function) => void;
 meta?: any;
}

mode

类型: string

默认值: "hash" (浏览器环境) | "abstract" (Node.js 环境)

可选值: "hash" | "history" | "abstract"

配置路由模式

1、hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器

2、history: 依赖 HTML5 History API 和服务器配置

3、abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式

base

类型: string

默认值: "/"

应用的基路径。例如,如果整个单页应用服务在 /app/ 下,然后 base 就应该设为 "/app/"

linkActiveClass

类型: string

默认值: "router-link-active"

全局配置 <router-link> 的默认『激活 class 类名』

scrollBehavior

类型: Function

签名:

(
 to: Route,
 from: Route,
 savedPosition?: { x: number, y: number }
) => { x: number, y: number } | { selector: string } | ?{}

Router实例

属性

router.app

类型: Vue instance

配置了 router 的 Vue 根实例

router.mode

类型: string

路由使用的 模式

router.currentRoute

类型: Route

当前路由对应的路由信息对象

方法

router.beforeEach(guard)

router.beforeResolve(guard) (2.5.0+): 此时异步组件已经加载完成

router.afterEach(hook):增加全局的导航钩子

router.push(location, onComplete?, onAbort?)

router.replace(location, onComplete?, onAbort?)

router.go(n)

router.back()

router.forward():动态的导航到一个新 url

router.getMatchedComponents(location?)

返回目标位置或是当前路由匹配的组件数组(是数组的定义/构造类,不是实例)。通常在服务端渲染的数据预加载时

router.resolve(location, current?, append?)

解析目标位置(格式和 <router-link> 的 to prop 一样),返回包含如下属性的对象

{
location:Location;
route:Route;
href:string;
}
router.addRoutes(routes)

动态添加更多的路由规则。参数必须是一个符合 routes 选项要求的数组

router.onReady(callback)

添加一个会在第一次路由跳转完成时被调用的回调函数。此方法通常用于等待异步的导航钩子完成,比如在进行服务端渲染的时候

对组件注入

注入的属性

通过在 Vue 根实例的 router 配置传入 router 实例,下面这些属性成员会被注入到每个子组件

$router

router 实例

$route

当前激活的路由信息对象。这个属性是只读的,里面的属性是 immutable(不可变) 的,不过可以 watch(监测变化) 它

【允许的额外配置】

beforeRouteEnter
beforeRouteLeave

更多关于Vue路由管理器Vue-router的文章请查看下面的相关链接

Javascript 相关文章推荐
jQuery对象和DOM对象的相互转化实现代码
Mar 02 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 Javascript
vue中将网页打印成pdf实例代码
Jun 15 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
微信小程序实现点击生成随机验证码
Sep 09 Javascript
jQuery实现朋友圈查看图片
Sep 11 jQuery
Vue的状态管理vuex使用方法详解
Feb 05 #Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 05 #Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 #Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 #Javascript
vue.js使用v-model实现父子组件间的双向通信示例
Feb 05 #Javascript
vue使用原生swiper代码实例
Feb 05 #Javascript
Vue如何使用混合Mixins和插件开发详解
Feb 05 #Javascript
You might like
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
微信小程序日历效果
2018/12/29 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
关于Python作用域自学总结
2019/06/10 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python创建n行m列数组示例
2019/12/02 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
考试保密承诺书
2014/08/30 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
病人慰问信范文
2015/02/15 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书