# 切换控制流水线
为更好的理解路由切换的管道,假设我们一个启用了路由的应用,此应用在路径 `/a/b/c` 时渲染了三个嵌套的 `<router-view>` :
![](http://vuejs.github.io/vue-router/zh-cn/pipeline/01.png)
接着,用户浏览新路径 `/a/d/e` ,导致需要更新,渲染一个新的组建树:
![](http://vuejs.github.io/vue-router/zh-cn/pipeline/02.png)
如何做到这些呢?这个过程包含一些我们必须要做的工作:
1. 可以重用组件 A ,因为重新渲染后,组件 A 依然保持不变。
2. 需要停用并移除组件 B 和 C 。
3. 启用并激活组件 D 和 E 。
4. 在执行步骤2和3之前,需要确保切换效果有效 - 也就是说,为保证切换中涉及的所有组件都**能**按照期望的那样被停用/激活。
使用 vue-router ,你可以控制通过实现切换钩子函数来控制这些步骤。但是在了解如何做的细节之前,我们先了解一下大局。
### 切换的各个阶段
我们可以把路由切换分为三个阶段:
1. **可重用阶段:**
检查当前的视图结构中是否存在可以重用的组件。这是通过对比两个新的组件树,找出共用的组件,然后检查它们的可重用性(通过 `canReuse` 选项)。默认情况下, 所有组件都是可重用的,除非是定制过。
![可重用阶段](http://vuejs.github.io/vue-router/zh-cn/pipeline/03.png)
2. **验证阶段:**
检查当前的组件是否能够停用以及新组件是否可以被激活。这是通过调用路由配置阶段的 `canDeactivate` 和 `canActivate` 钩子函数来判断的。
![验证阶段](http://vuejs.github.io/vue-router/zh-cn/pipeline/04.png)
注意,`canDeactivate` 按照从下至上的冒泡顺序检查,而 `canActivate` 则是从上之下。
任何一个钩子函数都可以终止界面切换。如果在验证阶段终止了界面切换,路由器会保持当前的应用状态,恢复到前一个路径。
3. **激活阶段:**
一旦所有的验证钩子函数都被调用而且没有终止切换,切换就可以认定是合法的。路由器则开始禁用当前组件并启用新组件。
![激活阶段](http://vuejs.github.io/vue-router/zh-cn/pipeline/05.png)
此阶段对应钩子函数的调用顺序和验证阶段相同,其目的是在组件切换真正执行之前提供一个进行清理和准备的机会。界面的更新会等到所有受影响组件的 `deactivate` 和 `activate` 钩子函数执行之后才进行。
`data` 这个钩子函数会在 `activate` 之后被调用,或者当前组件组件可以重用时也会被调用。
接下来我们会谈论一下切换过程中各个钩子函数的细节。
- vue
- 官方教程
- 起步
- 安装
- 概述
- Vue 实例
- Class 与 Style 绑定
- 数据绑定语法
- 条件渲染
- 列表渲染
- 表单控件绑定
- 组件
- 计算属性
- 自定义指令
- 自定义过滤器
- 方法与事件处理器
- 混合
- 插件
- 过渡
- 深入响应式原理
- 对比其它框架
- 构建大型应用
- API
- vue-router
- 安装
- 基本用法
- 嵌套路由
- 路由对象和路由匹配
- 具名路径
- 路由配置项
- router-view
- v-link
- 切换控制流水线
- 切换钩子函数
- data
- activate
- deactivate
- canActivate
- canDeactivate
- canReuse
- API
- 路由实例属性
- router.start
- router.stop
- router.map
- router.on
- router.go
- router.replace
- router.redirect
- router.alias
- router.beforeEach
- router.afterEach
- 文章
- VUE.JS: A (RE)INTRODUCTION
- 源码
- 表单控件绑定