vue-router包含的功能:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

HTML 

<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>

 定义路由 

// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]

 我们可以在任何组件内通过 this.$router 访问路由器,也可以通过 ​this.$route​ 访问当前路由

// Home.vue
export default {
computed: {
username () {
// 我们很快就会看到 `params` 是什么
return this.$route.params.username
}
},
methods: {
goBack () {
window.history.length > 1
? this.$router.go(-1)
: this.$router.push('/')
}
}
}

当 ​​<router-link>​​​ 对应的路由匹配成功,将自动设置 class 属性值 ​​.router-link-active。​

​<router-link>​​​ 组件支持用户在具有路由功能的应用中 (点击) 导航。 通过 ​​to​​​ 属性指定目标地址,默认渲染成带有正确链接的 ​​<a>​​​ 标签,可以通过配置 ​​tag​​ 属性生成别的标签.。

当你在 HTML5 history 模式下使用 ​​base​​​ 选项之后,所有的 ​​to​​ 属性都不需要写 (基路径) 了。

​<router-link>​​ 

 to

<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染结果 -->
<a href="home">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

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

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

 append

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

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

tag

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

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

active-class

默认值: ​​"router-link-active"​

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

event

默认值: 'click'

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

Router 构建选项

routes

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

// 2.6.0+
caseSensitive?: boolean; // 匹配规则是否大小写敏感?(默认值:false)
pathToRegexpOptions?: Object; // 编译正则的选项
}

mode

  • 类型: ​​string​
  • 默认值: ​​"hash" (浏览器环境) | "abstract" (Node.js 环境)​
  • 可选值: ​​"hash" | "history" | "abstract"​​配置路由模式:
  • ​hash​​: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。
  • ​history​​​: 依赖 HTML5 History API 和服务器配置。查看 ​​HTML5 History 模式​​。
  • ​abstract​​: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式。

base

  • 类型: ​​string​
  • 默认值: ​​"/"​​应用的基路径。例如,如果整个单页应用服务在 ​​/app/​​ 下,然后 ​​base​​ 就应该设为 ​​"/app/"​​。

scrollBehavior

  • 类型: ​​Function​
type PositionDescriptor =
{ x: number, y: number } |
{ selector: string } |
?{}

type scrollBehaviorHandler = (
to: Route,
from: Route,
savedPosition?: { x: number, y: number }
) => PositionDescriptor | Promise<PositionDescriptor>

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 ​​vue-router​​ 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

注意: 这个功能只在支持 history.pushState 的浏览器中可用。

当创建一个 Router 实例,你可以提供一个 ​​scrollBehavior​​ 方法:

const router = new VueRouter({
routes: [...],
scrollBehavior (to, from, savedPosition) {
// return 期望滚动到哪个的位置
}
})

 举例:

scrollBehavior (to, from, savedPosition) {
return { x: 0, y: 0 }
}

动态路由匹配

const router = new VueRouter({
routes: [
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User }
]
})

像 ​​/user/foo​​​ 和 ​​/user/bar​​ 都将映射到相同的路由。

参数值会被设置到 ​​this.$route.params​​,可以在每个组件内使用

<div>User {{ $route.params.id }}</div>

响应路由参数的变化 

想对路由参数的变化作出响应的话,你可以简单地 watch

watch: {
'$route' (to, from) {
// 对路由变化作出响应...
}
}

捕获所有路由或 404 Not found 路由

{
// 会匹配所有路径
path: '*'
}
{
// 会匹配以 `/user-` 开头的任意路径
path: '/user-*'
}

当使用通配符路由时,请确保路由的顺序是正确的,也就是说含有通配符的路由应该放在最后。路由 ​​{ path: '*' }​​ 通常用于客户端 404 错误。

路由对象属性

  • $route.path
  • 类型: ​​string​​​字符串,对应当前路由的路径,总是解析为绝对路径,如 ​​"/foo/bar"​​。
  • $route.params
  • 类型: ​​Object​​一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象。
  • $route.query
  • 类型: ​​Object​​​一个 key/value 对象,表示 URL 查询参数。例如,对于路径 ​​/foo?user=1​​,则有 ​​$route.query.user == 1​​,如果没有查询参数,则是个空对象。
  • $route.hash
  • 类型: ​​string​​​当前路由的 hash 值 (带 ​​#​​) ,如果没有 hash 值,则为空字符串。
  • $route.fullPath
  • 类型: ​​string​​完成解析后的 URL,包含查询参数和 hash 的完整路径。
  • $route.matched
  • 类型: ​​Array<RouteRecord>​

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

 编程式的导航

router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

 router.replace(...)

​router.push​​ 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

​router.go(n)​

意思是在 history 记录中向前或者后退多少步,类似 ​​window.history.go(n)​​。

// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)

// 后退一步记录,等同于 history.back()
router.go(-1)

// 前进 3 步记录
router.go(3)

// 如果 history 记录不够用,那就默默地失败呗
router.go(-100)
router.go(100)

命名视图

有时候想同时 (同级) 展示多个视图,而不是嵌套展示

你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口

<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>

 

const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar,
b: Baz
}
}
]
})

 重定向

重定向也是通过 ​​routes​​​ 配置来完成,下面例子是从 ​​/a​​​ 重定向到 ​​/b​​:

const router = new VueRouter({
routes: [
{ path: '/a', redirect: '/b' }
]
})

重定向的目标也可以是一个命名的路由:

const router = new VueRouter({
routes: [
{ path: '/a', redirect: { name: 'foo' }}
]
})