2
2
3
3
## 简介
4
4
5
- 除了核心功能默认内置的指令 (` v-model ` 和 ` v-show ` ),Vue 也允许注册自定义指令。注意,在 Vue 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:
5
+ 除了核心功能默认内置的指令 (例如 ` v-model ` 和 ` v-show ` ),Vue 也允许注册自定义指令。注意,在 Vue 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:
6
6
7
7
<common-codepen-snippet title =" Custom directives: basic example " slug =" JjdxaJW " :preview =" false " />
8
8
9
- 当页面加载时,该元素将获得焦点 (注意:` autofocus ` 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态 。此外,你可以单击 ` Rerun ` 按钮,输入将被聚焦 。
9
+ 当页面加载时,该元素将获得焦点 (注意:` autofocus ` 在移动版 Safari 上不工作)。事实上,如果你在打开这个页面后还没有点击过任何内容,那么此时这个输入框就应当处于聚焦状态 。此外,你可以单击 ` Rerun ` 按钮,输入框将被聚焦 。
10
10
11
11
现在让我们用指令来实现这个功能:
12
12
13
13
``` js
14
14
const app = Vue .createApp ({})
15
15
// 注册一个全局自定义指令 `v-focus`
16
16
app .directive (' focus' , {
17
- // 当被绑定的元素插入到 DOM 中时……
17
+ // 当被绑定的元素挂载到 DOM 中时……
18
18
mounted (el ) {
19
- // Focus the element
19
+ // 聚焦元素
20
20
el .focus ()
21
21
}
22
22
})
@@ -35,7 +35,7 @@ directives: {
35
35
}
36
36
```
37
37
38
- 然后你可以在模板中任何元素上使用新的 ` v-focus ` property ,如下:
38
+ 然后你可以在模板中任何元素上使用新的 ` v-focus ` attribute ,如下:
39
39
40
40
``` html
41
41
<input v-focus />
@@ -45,9 +45,11 @@ directives: {
45
45
46
46
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
47
47
48
- - ` beforeMount ` :当指令第一次绑定到元素并且在挂载父组件之前调用。在这里你可以做一次性的初始化设置 。
48
+ - ` created ` :在绑定元素的 attribute 或事件监听器被应用之前调用。在指令需要附加须要在普通的 ` v-on ` 事件监听器前调用的事件监听器时,这很有用 。
49
49
50
- - ` mounted ` :在挂载绑定元素的父组件时调用。
50
+ - ` beforeMount ` :当指令第一次绑定到元素并且在挂载父组件之前调用。
51
+
52
+ - ` mounted ` :在绑定元素的父组件被挂载后调用。
51
53
52
54
- ` beforeUpdate ` :在更新包含组件的 VNode 之前调用。
53
55
@@ -67,7 +69,7 @@ directives: {
67
69
68
70
指令的参数可以是动态的。例如,在 ` v-mydirective:[argument]="value" ` 中,` argument ` 参数可以根据组件实例数据进行更新!这使得自定义指令可以在应用中被灵活使用。
69
71
70
- 例如你想要创建一个自定义指令,用来通过固定布局将元素固定在页面上。我们可以像这样创建一个通过指令值来更新竖直位置像素值的自定义指令 :
72
+ 例如你想要创建一个自定义指令,用来通过固定布局将元素固定在页面上。我们可以创建一个自定义指令,它的值以像素为单位更新被固定元素的垂直位置,如下所示 :
71
73
72
74
``` vue-html
73
75
<div id="dynamic-arguments-example" class="demo">
@@ -82,7 +84,7 @@ const app = Vue.createApp({})
82
84
app .directive (' pin' , {
83
85
mounted (el , binding ) {
84
86
el .style .position = ' fixed'
85
- // binding.value is the value we pass to directive - in this case, it's 200
87
+ // binding.value 是我们传递给指令的值——在这里是 200
86
88
el .style .top = binding .value + ' px'
87
89
}
88
90
})
@@ -111,7 +113,7 @@ const app = Vue.createApp({
111
113
app .directive (' pin' , {
112
114
mounted (el , binding ) {
113
115
el .style .position = ' fixed'
114
- // binding.arg is an argument we pass to directive
116
+ // binding.arg 是我们传递给指令的参数
115
117
const s = binding .arg || ' top'
116
118
el .style [s] = binding .value + ' px'
117
119
}
@@ -124,7 +126,7 @@ app.mount('#dynamic-arguments-example')
124
126
125
127
<common-codepen-snippet title =" Custom directives: dynamic arguments " slug =" YzXgGmv " :preview =" false " />
126
128
127
- 我们的定制指令现在已经足够灵活 ,可以支持一些不同的用例。为了使其更具动态性,我们还可以允许修改绑定值。让我们创建一个附加属性 ` pinPadding ` ,并将其绑定到 ` <input type="range"> ` 。
129
+ 我们的自定义指令现在已经足够灵活 ,可以支持一些不同的用例。为了使其更具动态性,我们还可以允许修改绑定值。让我们创建一个附加属性 ` pinPadding ` ,并将其绑定到 ` <input type="range"> ` 。
128
130
129
131
``` vue-html{4}
130
132
<div id="dynamicexample">
@@ -145,7 +147,7 @@ const app = Vue.createApp({
145
147
})
146
148
```
147
149
148
- 让我们扩展我们的指令逻辑来重新计算固定元件更新的距离 。
150
+ 让我们扩展指令逻辑以在组件更新后重新计算固定的距离 。
149
151
150
152
``` js{7-10}
151
153
app.directive('pin', {
0 commit comments