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 相关文章推荐
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
js中取得变量绝对值的方法
Jan 03 Javascript
浅谈JavaScript正则表达式分组匹配
Apr 10 Javascript
浅谈jquery中delegate()与live()
Jun 22 Javascript
Bootstrap树形组件jqTree的简单封装
Jan 25 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 Javascript
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
使用Sphinx对索引进行搜索
2013/06/25 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
PHP对象实例化单例方法
2017/01/19 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
ExpressJS入门实例
2015/01/14 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
python生成器的使用方法
2013/11/21 Python
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
python Django的web开发实例(入门)
2019/07/31 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
法制演讲稿
2014/09/10 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
工作态度不好检讨书
2015/05/06 职场文书
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android