安裝
1 | npm install vue-router |
1 | import Vue from 'vue' |
介紹
嵌套的路由/視圖表
模块化的、基于组件的路由配置
路由参数、查询、通配符
基于Vue.js过渡系统的视图过渡效果
带有自动激活的CSSclass的链接
HTML5历史模式或hash模式,在IE9中自动降级
自定义的滚动条行为
基于Vue.js过渡系统的视图过渡效果
起步
用Vue.js + Vue Router创建单页应用,是非常简单的。使用Vue.js,我们已经可以通过组合组件来组成应用程序,当你要把Vue Router添加进来,我们需要做的是,将组件映射到路由,然后告诉Vue Router在哪里渲染它们。下面是个基本例子:
1 | <div id="app"> |
1 | // 0.如果使用模块化机制编程,导入Vue和VueRouter,要调用Vue.use(VueRouter) |
通过注入路由器,我们可以在任何组件内通过this.$router
访问路由器,也可以通过this.$route
访问当前路由
1 | // Home.vue |
当<router-link>
对应的路由匹配成功,将自动设置class
属性值.router-link-active
。
动态路由匹配
我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个User
组件,对于所有ID
各不相同的用户,都要使用这个组件来渲染。那么,我们可以在vue-router
的路由路径中使用动态路径参数来达到这个效果。
1 | const User = { |
现在像/user/foo
和/user/bar
都将映射到相同的路由。
一个路径参数使用冒号:标记。当匹配到一个路由时,参数值会被设置到this.$route.params
,可以在每个组件内使用。于是,我们可以更新User
的模板,输出当前用户的ID
。
1 | const User = { |
模式 | 匹配路徑 | $router.params |
---|---|---|
/user/:username | /user/evan | { username: ‘evan’ } |
/user/:username/post/:post_id | /user/evan/post/123 | { username: ‘evan’, post_id: 123 } |
响应路由参数的变化
当使用路由参数时,例如从/user/foo导航到/user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
复用组件时,想对路由参数的变化作出响应的话,你可以简单地watch(监测变化)$route对象。
1 | const User = { |
或者使用beforeRouteUpdate
守卫。
1 |
|
捕获所有路由或 404 Not found 路由
常规参数只会匹配被/分隔的URL片段中的字符。如果想匹配任意路径,我们可以使用通配符(*):
1 | { |
当使用通配符路由时,请确保路由的顺序是正确的,也就是说含有通配符的路由应该放在最后。路由{ path: ‘*’ }通常用于客户端404错误。如果你使用了History模式,请确保正确配置你的服务器。
当使用一个通配符时,$route.params
内会自动添加一个名为pathMatch
参数。它包含了URL通过通配符被匹配的部分:
1 | // 给出一个路由 { path: '/user-*' } |
高级匹配模式
vue-router
使用path-to-regexp
作为路径匹配引擎,所以支持很多高级的匹配模式,例如:可选的动态路径参数、匹配零个或多个、一个或多个,甚至是自定义正则匹配。
嵌套路由
实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL中各段动态路径也按某种结构对应嵌套的各层组件。
1 | const User = { |
这里的<router-view>
是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套<router-view>
。例如,在User组件的模板添加一个<router-view>
。
1 | const User = { |
要在嵌套的出口中渲染组件,需要在VueRouter的参数中使用children配置。
1 |
|
要注意,以/开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。
children
配置就是像routes
配置一样的路由配置数组,所以可以嵌套多层路由。
此时,基于上面的配置,当你访问/user/foo
时,User
的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个空的子路由。
1 |
|
命名路由
有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。可以在创建Router
实例的时候,在routes
配置中给某个路由设置名称。
1 | const router = new VueRouter({ |
要链接到一个命名路由,可以给router-link的to属性传一个对象。
1 | <router-link :to="{name:'user',params: { userId:123 }}">User</router-link> |
这跟代码调用router.push()是一回事。
1 | router.push({ name:'user',params: { userId:123 }}) |
这两种方式都会把路由导航到/user/123路径。
重定向和别名
重定向也是通过routes配置来完成,下面例子是从/a重定向到/b。
1 | const router = new VueRouter({ |
重定向的目标也可以是一个命名的路由。
1 | const router = new VueRouter({ |
注意导航守卫并没有应用在跳转路由上,而仅仅应用在其目标上。在下面这个例子中,为/a路由添加一个beforeEach或beforeLeave守卫并不会有任何效果。
路由组件传参
在组件中使用$route
会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的URL上使用,限制了其灵活性。
使用props
将组件和路由解耦:
取代与$route的耦合
1 | const User = { |
通过props解耦
1 | const User = { |
布尔模式
如果props
被设置为true
,route.params
将会被设置为组件属性。
对象模式
如果props
是一个对象,它会被按原样设置为组件属性。当props是静态的时候有用。
1 | const router = new VueRouter({ |
HTML5 History模式
vue-router
默认hash
模式——使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载。
如果不想要hash
,我们可以用路由的history
模式,这种模式充分利用history.pushState API
来完成URL跳转而无须重新加载页面。`
当你使用history
模式时,URL就像正常的url
,例如http://yoursite.com/user/id
。
不过这种模式还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问http://oursite.com/user/id
就会返回404,这就不好看了。
所以要在服务端增加一个覆盖所有情况的候选资源:如果URL匹配不到任何静态资源,则应该返回同一个index.html
页面,这个页面就是你app
依赖的页面。
这么做以后,你的服务器就不再返回404
错误页面,因为对于所有路径都会返回index.html
文件。为了避免这种情况,你应该在Vue应用里面覆盖所有的路由情况,然后在给出一个404页面。
1 | const router = new VueRouter({ |