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+CSS 实现的超Sexy下拉菜单
Jan 17 Javascript
JavaScript 异步方法队列链实现代码分析
Jun 05 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
动态加载脚本提升javascript性能
Feb 24 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
JS处理json日期格式化问题
Oct 01 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
4个顶级开源JavaScript图表库
Sep 29 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
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
PHP中each与list用法分析
2016/01/08 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
php简单复制文件的方法
2016/05/09 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
小程序实现搜索框
2020/06/19 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
教你用Python写安卓游戏外挂
2018/01/11 Python
Python中的Django基本命令实例详解
2018/07/15 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
django 环境变量配置过程详解
2019/08/06 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
int和Integer有什么区别
2013/05/25 面试题
初中生期末考试的自我评价
2013/12/17 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
保护环境标语
2014/06/09 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
战友聚会致辞
2015/07/28 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python