1
1
# カスタムディレクティブ {#custom-directives}
2
2
3
3
<script setup >
4
- const vFocus = {
4
+ const vHighlight = {
5
5
mounted : el => {
6
- el .focus ( )
6
+ el .classList . add ( ' is-highlight ' )
7
7
}
8
8
}
9
9
</script >
10
10
11
+ <style >
12
+ .vt-doc p .is-highlight {
13
+ margin-bottom : 0 ;
14
+ }
15
+
16
+ .is-highlight {
17
+ background-color : yellow ;
18
+ color : black ;
19
+ }
20
+ </style >
21
+
11
22
## はじめに {#introduction}
12
23
13
24
コアに設定されているデフォルトのディレクティブのセット(` v-model ` や ` v-show ` など)に加え、Vue では独自のカスタムディレクティブを登録することができます。
@@ -20,14 +31,16 @@ Vue におけるコードの再利用として 2 つの方法を紹介してき
20
31
21
32
``` vue
22
33
<script setup>
23
- // テンプレート内で v-focus が有効になります
24
- const vFocus = {
25
- mounted: (el) => el.focus()
34
+ // テンプレート内で v-highlight が有効になります
35
+ const vHighlight = {
36
+ mounted: (el) => {
37
+ el.classList.add('is-highlight')
38
+ }
26
39
}
27
40
</script>
28
41
29
42
<template>
30
- <input v-focus / >
43
+ <p v-highlight>This sentence is important!</p >
31
44
</template>
32
45
```
33
46
@@ -36,33 +49,31 @@ const vFocus = {
36
49
<div class =" options-api " >
37
50
38
51
``` js
39
- const focus = {
40
- mounted : (el ) => el .focus ( )
52
+ const highlight = {
53
+ mounted : (el ) => el .classList . add ( ' is-highlight ' )
41
54
}
42
55
43
56
export default {
44
57
directives: {
45
- // テンプレート内で v-focus が有効になります
46
- focus
58
+ // テンプレート内で v-highlight が有効になります
59
+ highlight
47
60
}
48
61
}
49
62
```
50
63
51
64
``` vue-html
52
- <input v-focus / >
65
+ <p v-highlight>This sentence is important!</p >
53
66
```
54
67
55
68
</div >
56
69
57
70
<div class =" demo " >
58
- <input v-focus placeholder = " This should be focused " / >
71
+ <p v-highlight > This sentence is important!</ p >
59
72
</div >
60
73
61
- ページの他の場所をクリックしていないと仮定すると、上の入力欄は自動的にフォーカスされるはずです。このディレクティブはページロード時だけでなく、Vue によって要素が動的に挿入されたときにも機能するため、` autofocus ` 属性よりも便利です。
62
-
63
74
<div class =" composition-api " >
64
75
65
- ` <script setup> ` では、接頭辞が ` v ` で始まるキャメルケースの変数をカスタムディレクティブとして使用することができます。上の例では、` vFocus ` はテンプレート内で ` v-focus ` として使用できます。
76
+ ` <script setup> ` では、接頭辞が ` v ` で始まるキャメルケースの変数をカスタムディレクティブとして使用することができます。上の例では、` vHighlight ` はテンプレート内で ` v-highlight ` として使用できます。
66
77
67
78
` <script setup> ` を使用しない場合、カスタムディレクティブは ` directives ` オプションを使用して登録することができます:
68
79
@@ -72,8 +83,8 @@ export default {
72
83
/* ...*/
73
84
},
74
85
directives: {
75
- // テンプレート内で v-focus が有効になります
76
- focus : {
86
+ // テンプレート内で v-highlight が有効になります
87
+ highlight : {
77
88
/* ... */
78
89
}
79
90
}
@@ -93,15 +104,59 @@ export default {
93
104
``` js
94
105
const app = createApp ({})
95
106
96
- // 全てのコンポーネントで v-focus が使用可能
97
- app .directive (' focus ' , {
107
+ // 全てのコンポーネントで v-highlight が使用可能
108
+ app .directive (' highlight ' , {
98
109
/* ... */
99
110
})
100
111
```
101
112
102
- ::: tip
103
- カスタムディレクティブは DOM を直接操作することでしか必要な機能を実現できない場合にのみ使用してください。` v-bind ` のような組み込みディレクティブを使用した宣言的なテンプレートは、効率的かつサーバーレンダリングフレンドリーです。可能なかぎり組み込みディレクティブを使用することをおすすめします。
104
- :::
113
+ ## カスタムディレクティブを使用するタイミング {#when-to-use}
114
+
115
+ カスタムディレクティブは DOM を直接操作することでしか必要な機能を実現できない場合にのみ使用してください。
116
+
117
+ 一般的な例として、要素にフォーカスを当てる ` v-focus ` カスタムディレクティブがあります。
118
+
119
+ <div class =" composition-api " >
120
+
121
+ ``` vue
122
+ <script setup>
123
+ // テンプレート内で v-focus が有効になります
124
+ const vFocus = {
125
+ mounted: (el) => el.focus()
126
+ }
127
+ </script>
128
+
129
+ <template>
130
+ <input v-focus />
131
+ </template>
132
+ ```
133
+
134
+ </div >
135
+
136
+ <div class =" options-api " >
137
+
138
+ ``` js
139
+ const focus = {
140
+ mounted : (el ) => el .focus ()
141
+ }
142
+
143
+ export default {
144
+ directives: {
145
+ // テンプレート内で v-focus が有効になります
146
+ focus
147
+ }
148
+ }
149
+ ```
150
+
151
+ ``` vue-html
152
+ <input v-focus />
153
+ ```
154
+
155
+ </div >
156
+
157
+ このディレクティブは ` autofocus ` 属性よりも便利です。ページ読み込み時だけでなく、Vue によって要素が動的に挿入されたときにも機能するからです!
158
+
159
+ 可能な限り ` v-bind ` のような組み込みディレクティブを使用した宣言的なテンプレートを推奨します。これらはより効率的で、サーバーレンダリングにも適しているためです。
105
160
106
161
## ディレクティブフック {#directive-hooks}
107
162
@@ -214,7 +269,6 @@ app.directive('demo', (el, binding) => {
214
269
コンポーネントにカスタムディレクティブを使用することは推奨しません。コンポーネントに複数のルートノードがある場合、予期しない動作が発生する可能性があります。
215
270
:::
216
271
217
-
218
272
コンポーネントで使用すると、[ フォールスルー属性] ( /guide/components/attrs ) と同様にカスタムディレクティブは常にコンポーネントのルートノードに適用されます。
219
273
220
274
``` vue-html
0 commit comments