2.x 版本的vue-router相比之前的0.7.x版本,有很多破坏性改变:
通用 API 的修改
旧的
router.go()现在改成了router.push().新的
router.go类似window.history.go(): 接受一个数值作为参数在历史栈中导航-
新增的方法:
router.back()router.forward()
路由配置
所有路由配置都通过一个单独的对象传到Router的构造函数。所以可用的选项,参见configuration object's type declaration。
routes 选项取代了 router.map()。此外,路由配置现在用数组而不是用对象哈希表来作为数据结构。这保证了一致的匹配次序(对象键值枚举的次序是依赖浏览器的实现的)。
这里 是一个新的配置语法的例子.
以下的路由器实例配置选项被作废了:
history(被mode取代)abstract(被mode取代)root(被base取代)saveScrollPosition(被scrollBehavior取代,后者用起来更加灵活,下面会提到)hashbang(因为 hashbang 在Google爬站的时候不再需要,所以移除了此选项)transitionOnLoad(因为 Vue 2.0 有显式的视觉表现过渡动画控制,所以此选项移除)suppressTransitionError(因为钩子函数的系统的简化而移除)
新的mode选项取值为: (默认是 "hash"):
"abstract"
"hash"
"history"
在不支持 history.pushState 的浏览器中, 路由器会自动回退为 hash 模式.
下列方法已经作废:
router.map(被routes选项取代)router.beforeEach(被beforeEach选项取代,不过 beta2中有修改,见下面)router.afterEach(被afterEach选项取代,不过 beta2中有修改,见下面)router.redirect(现在可以在routes中直接声明, 参见 Example)router.alias(现在可以在routes配置中直接声明, 参见 Example)
Beta 2 中,beforeEach 和 afterEach 又被改回成为 router的实例方法。作者说是这可以让插件和模块更加方便的在router实例创建后增加hooks。
导航钩子函数
钩子系统被极大简化,所有0.7的迁移钩子都作废了,下面是替代方案:
使用组件自身的生命周期钩子函数来替代
activate和deactivate在
$router上使用watcher来响应路由改变 (e.g. 比如基于新的路由参数获取数据 - Example)canActivate可以被router 的配置中的beforeEnter中实现 ExamplecanDeactivate已经被beforeRouteLeave取代, 后者在一个组件的根级定义中指定。这个钩子函数在调用时是将组件的实例作为其上下文的。ExamplecanReuse已经被移除,因其容易混淆且很少被用到。
此外,在2.0版本中所有的钩子函数都有相同简洁的签名:
guard (toRoute, redirect, next) {
// call redirect to redirect to another route
// call next to confirm current route
// or do nothing to cancel the navigation
}
这些函数也不再支持返回 Promises.
链接(Links)
v-link 指令已经被 组件替代. 这个组件接受以下属性参数:
to: 一个路径字符串, 或者一个 Location Descriptor 对象.exact: 用于控制当前激活项的匹配行为(严格匹配或者贪婪匹配).append: 控制相对链接路径的追加方式replace: 替代而不是作为历史条目压榨你active-class: 当链接项激活时增加的 CSS 样式
这里有个 复杂的例子 展示了的用法。
命名视图 (Named Views)
单个路由现在可以映射到多个命名组件。这些组件将会在渲染在对应命名的多个 中. Example
(译者注)这个功能很赞,提供了一种新的用多个组件组成页面结构的方法,同时又不增加组件之间的耦合。
滚动行为(Scroll Behavior)
scrollBehavior 选项接受一个函数,返回在路由导航时控制页面如何滚动的规则。你可以代码控制是否要滚动的页面顶部、书签或者在状态中保存的位置。 Example
Beta2 版本中又对 scrollBehavior 做了修改:
beta.1 中返回 { hash: true } 来滚动到文档中的一个锚点,现在返回的是 { selector: route.hash }。这也同时意味着你可以返回任意的 CSS 选择器,来匹配成要滚动到的目标。
此外,你还可以返回{ selector: '...', x: 0, y: 0 },这会让路由器首先尝试滚动到匹配的元素,如果没有找到匹配元素,那就滚动到 x和y指定的位置。