Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proofread custom-directive.md #152

Merged
merged 1 commit into from
Oct 11, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions src/guide/custom-directive.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ order: 16

## 简介

除了默认设置的核心指令(`v-model``v-show`),Vue也允许注册自定义指令。注意,在vue2.0里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯DOM元素进行底层操作,这时候就会用到自定义指令。下面这个例子聚焦一个input元素,像这样:
除了默认设置的核心指令( `v-model``v-show` ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样:

{% raw %}
<div id="simplest-directive-example" class="demo">
Expand All @@ -24,20 +24,20 @@ new Vue({
</script>
{% endraw %}

页面加载时,元素将获得焦点。事实上,你访问后还没点击任何内容,input就获得了焦点。现在让我们完善这个指令:
当页面加载时,元素将获得焦点。事实上,你访问后还没点击任何内容,input 就获得了焦点。现在让我们完善这个指令:

``` js
// 注册一个全局自定义指令 v-focus
Vue.directive('focus', {
// 当绑定元素插入到DOM中
// 当绑定元素插入到 DOM 中
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
```

也可以注册局部指令,组件中接受一个 `directives`的选项:
也可以注册局部指令,组件中接受一个 `directives` 的选项:

``` js
directives: {
Expand All @@ -48,7 +48,7 @@ directives: {
}
```

然后你可以在模板中任何元素上使用新的`v-focus`属性:
然后你可以在模板中任何元素上使用新的 `v-focus` 属性:

``` html
<input v-focus>
Expand All @@ -61,31 +61,31 @@ directives: {
- `bind`: 只调用一次, 指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

- `inserted`: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

- `update`: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。

- `componentUpdated`: 被绑定元素所在模板完成一次更新周期时调用。

- `unbind`: 只调用一次, 指令与元素解绑时调用。

接下来我们来看一下钩子函数的参数 (包括 `el`, `binding`, `vnode`, `oldVnode`) 。
接下来我们来看一下钩子函数的参数 (包括 `el`,`binding`,`vnode`,`oldVnode`) 。

## 钩子函数参数

钩子函数被赋予了以下参数:

- **el**: 指令所绑定的元素,可以用来直接操作 dom
- **el**: 指令所绑定的元素,可以用来直接操作 DOM
- **binding**: 一个对象,包含以下属性:
- **name**: 指令名,不包括 `v-` 前缀。
- **value**: 指令的绑定值, 例如: `v-my-directive="1 + 1"`, value 的值是 `2`。
- **oldValue**: 指令绑定的前一个值, 仅在 `update` 和 `componentUpdated` 钩子中可用。无论值是否改变都可用。
- **expression**: 绑定值的字符串形式。 例如 `v-my-directive="1 + 1"` , expression 的值是 `"1 + 1"`。
- **arg**: 传给指令的参数。例如 `v-my-directive:foo`, arg 的值是 `"foo"`。
- **modifiers**: 一个包含编辑器的对象。 例如: `v-my-directive.foo.bar`, 编辑器对象 modifiers的值是 `{ foo: true, bar: true }`。
- **vnode**: Vue 编译生成的虚拟节点, 参考 [VNode API](/api/#VNode-Interface) 详情
- **modifiers**: 一个包含编辑器的对象。 例如: `v-my-directive.foo.bar`, 编辑器对象 modifiers 的值是 `{ foo: true, bar: true }`。
- **vnode**: Vue 编译生成的虚拟节点, 查阅 [VNode API](/api/#VNode-Interface) 了解更多详情
- **oldVnode**: 上一个虚拟节点, 仅在 `update` 和 `componentUpdated` 钩子中可用。

<p class="tip">除了 `el` 之外, 其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 [dataset] 来进行。(https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset).</p>
<p class="tip">除了 `el` 之外, 其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 [dataset](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset) 来进行。</p>

一个使用了这些参数的自定义钩子样例:

Expand Down Expand Up @@ -141,16 +141,16 @@ new Vue({

## 函数简写

大多数情况下,只需要在 `bind` 和 `update` 钩子中做重复动作,而不关心其它钩子函数。可以这样写:
大多数情况下,我们可能想在 `bind` 和 `update` 钩子上做重复动作,并且不想关心其它的钩子函数。可以这样写:

``` js
Vue.directive('color-swatch', function (el, binding) {
el.style.backgroundColor = binding.value
})
```
## 对象常量
## 对象字面量

如果自定义指令需要复杂的值,也可以传递 javascript 对象。要知道,指令函数能够接受所有类型的 javascript 常量
如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法类型的 Javascript 表达式

``` html
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Expand Down