指南
基础概要
- 安装
- 介绍
- 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) { |