1、使用 router-link 组件来导航,通过传入 to
属性指定链接,<router-link> 默认会被渲染成一个 <a>
标签
html部分
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
js部分
// 1. 定义(路由)组件
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
//可以从其他文件 import 进来
const Foo = r => require.ensure([], () => r(require('@/page/Foo.vue')), 'Foo')//@代表src文件夹
// 2. 定义路由
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
// 3. 创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
// 4. 创建和挂载根实例。
const app = new Vue({
router
}).$mount('#app')
当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active
2、动态路由匹配
例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染
const User = {
template: '<div>User</div>'
}
const router = new VueRouter({
routes: [
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User }
]
})
- 当匹配到一个路由时,参数值会被设置到
this.$route.params
我们可以更新 User 的模板,输出当前用户的 ID:
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
模式 | 匹配路径 | $route.params |
---|---|---|
/user/:username | /user/evan | { username: 'evan' } |
/user/:username/post/:post_id | /user/evan/post/123 | { username: 'evan', post_id: 123 } |
3、路由信息对象的属性
- $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 数组)。
- 类型:
const router = new VueRouter({
routes: [
{ path: '/foo', component: Foo,
children: [
{ path: 'bar', component: Bar }
]
}
]
})
当 URL 为 /foo/bar
,$route.matched
将会是一个包含从上到下的所有对象(副本)。
- $route.name
* 当前路由的名称,如果有的话。(查看 命名路由)
4、命名路由
通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候
const router = new VueRouter({
routes: [
{ path: '/', name: 'home', component: Home },
{ path: '/foo', name: 'foo', component: Foo },
{ path: '/user/::userId', name: 'user', component: User }
]
})
要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:
<div id="app">
<h1>Named Routes</h1>
<p>Current route name: {{ $route.name }}</p>
<ul>
<li><router-link :to="{ name: 'home' }">home</router-link></li>
<li><router-link :to="{ name: 'foo' }">foo</router-link></li>
<li><router-link :to="{ name: 'user', params: {userId:123}}">bar</router-link></li>
</ul>
<router-view class="view"></router-view>
</div>
这跟代码调用 router.push() 是一回事:
router.push({ name: 'user', params: { userId: 123 }})
5、路由的跳转总结
*<router-link to="home">Home</router-link>
*<router-link v-bind:to="'home'">Home</router-link>
*<router-link :to="{ path: 'home' }">Home</router-link>
*<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
*<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>
我们可以通过设置router-link中的tag来改变链接的标签
<router-link tag="li" to="/foo">
<a>/foo</a>
</router-link>