指南
基础概要
- 安装
 - 介绍
 - Vue 实例
 - 模板语法
 - computed 属性和 watcher
 - class 和 style 绑定
 - 根据条件进行渲染
 - 列表渲染
 - 事件处理
 - 表单 input 绑定
 - 组件基础
 过渡 & 动画
- 进入、离开和列表的过渡
 深入组件
- 组件注册
 - props
 - 自定义事件
 - slot
 - 动态组件和异步组件
 - Handling Edge Cases
 - 状态间的过渡
 可重用 & 合成
- mixin
 - 自定义指令
 - render 函数 & jsx
 - 插件
 - 过滤器
 工具
- 生产环境部署
 - 单文件组件
 - 单元测试
 - TypeScript 支持
 扩展升级
- 路由
 - 状态管理
 - 服务端渲染
 内部原理
- 深入响应式原理
 升级迁移
- 从 Vue 1.x 迁移
 - 从 Vue Router 0.7.x 迁移
 - 从 Vuex 0.6.x 迁移到 1.0
 其他更多
- 对比其他框架
 - 加入 Vue.js 社区
 - 认识团队
 
自定义指令
简介
除了 Vue 核心携带着的一些默认指令(v-model 和 v-show)之外,Vue 还允许你注册自己的自定义指令。请注意,在 Vue 2.0 中,代码重用和抽象(reuse and abstraction)的主要是以组件的形式 - 但是,可能某些情况下,还是需要对普通元素进行一些底层 DOM 访问,这也是自定义指令仍然有其使用场景之处。接着来看一个在输入元素获取焦点的示例,如下:
当页面加载时,元素将获取焦点(注意:自动获取焦点在 Safari 手机上无法运行)。事实上,在访问页面时,如果你还没有点击任何地方,上面的输入框现在应该处于获取焦点的状态。现在让我们构建指令以完成此效果:
// 注册一个名为 `v-focus` 的全局自定义指令  | 
如果你想要注册一个局部指令,也可以通过设置组件的 directives 选项:
directives: {  | 
然后在模板中,你可以在任何元素上使用新增的 v-focus 属性,就像这样:
<input v-focus>  | 
钩子函数
指令的定义对象提供了几个钩子函数(全部可选):
bind:在指令第一次绑定到元素时调用,只会调用一次。可以在此钩子函数中,执行一次性的初始化设置。inserted:在已绑定的元素插入到父节点时调用(只能保证父节点存在,不一定存在于 document 中)。update:在包含指令的组件的 VNode 更新后调用,但可能之前其子组件已更新。指令的值可能更新或者还没更新,然而可以通过比较绑定的当前值和旧值,来跳过不必要的更新(参考下面的钩子函数)。componentUpdated:在包含指令的组件的 VNode 更新后调用,并且其子组件的 VNode 已更新。unbind:在指令从元素上解除绑定时调用,只会调用一次。
我们将在下一节中,探讨传入这些钩子函数的参数(例如 el, binding, vnode 和 oldVnode)。
指令钩子函数参数
指令钩子函数可传入以下参数:
el:指令绑定的元素。可以用于直接操作 DOM。binding:一个对象,包含以下属性:name:指令的名称,不包括v-前缀。value:向指令传入的值。例如,在v-my-directive="1 + 1"中,传入的值是2。oldValue:之前的值,只在update和componentUpdated钩子函数中可用。无论值是否发生变化,都可以使用。expression:指令绑定的表达式(expression),以字符串格式。例如,在v-my-directive="1 + 1"中,表达式是"1 + 1"。arg:向指令传入的参数,如果有的话。例如,在v-my-directive:foo中,参数是"foo"。modifiers:一个对象,包含修饰符,如果有的话。例如,在v-my-directive.foo.bar中,修饰符是{ foo: true, bar: true }。
vnode:由 Vue 编译器(Vue’s compiler)生成的虚拟 Node 节点(virtual node)。更多细节请查看 VNode API。oldVnode:之前的虚拟 Node 节点(virtual node),只在update和componentUpdated钩子函数中可用。
除了 el 之外的其他参数,都应该是只读的,并且永远不要去修改它们。如果你需要通过钩子函数共享信息数据,推荐通过元素的 dataset 来实现。
下面是使用这些属性的自定义指令的示例:
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>  | 
Vue.directive('demo', {  | 
函数简写(Function Shorthand)
在许多情况下,可能只需要在 bind 和 update 钩子函数上定义过相同的行为就足够了,而无需关心其他钩子函数。例如:
Vue.directive('color-swatch', function (el, binding) {  | 
对象字面量(Object Literals)
如果指令需要多个值,你还可以向指令传入 JavaScript 对象字面量(object literal)。记住,指令能够接收所有有效的 JavaScript 表达式。
<div v-demo="{ color: 'white', text: 'hello!' }"></div>  | 
Vue.directive('demo', function (el, binding) {  |