4
4
5
5
## イベント名
6
6
7
- コンポーネントやプロパティとは違い、イベント名の大文字と小文字は自動的に変換されません。その代わり発火されるイベント名とイベントリスナ名は全く同じにする必要があります。例えばキャメルケース(camelCase)のイベント名でイベントを発火した場合 :
7
+ コンポーネントやプロパティと同じように、イベント名は大文字と小文字を自動的に変換します。子コンポーネントからキャメルケースでイベントを発行すると、親コンポーネントではケバブケースのリスナを追加できるようになります :
8
8
9
9
``` js
10
10
this .$emit (' myEvent' )
11
11
```
12
12
13
- ケバブケース(kebab-case)でリスナ名を作っても何も起こりません:
14
-
15
13
``` html
16
- <!-- Won't work -->
17
14
<my-component @my-event =" doSomething" ></my-component >
18
15
```
19
16
20
- イベント名は JavaScript 内で変数やプロパティ名として扱われることはないので、キャメルケース(camelCase)またはパスカルケース(PascalCase)を使用する理由はありません。 さらに DOM テンプレート内の ` v-on ` イベントリスナは自動的に小文字に変換されます ( HTML が大文字と小文字を判別しないため)。このため ` @myEvent ` は ` @myevent ` になり ` myEvent ` にリスナが反応することができなくなります。
21
-
22
- こういった理由から ** いつもケバブケース(kebab-case)を使うこと** をお薦めします。
17
+ [ プロパティの形式] ( /guide/component-props.html#プロパティの形式-キャメルケース-vs-ケバブケース ) と同じように、DOM 内テンプレートを使っている場合は、ケバブケースのイベントリスナを使うことをお勧めします。文字列テンプーとを使っている場合は、この制約は適用されません。
23
18
24
19
## カスタムイベントの定義
25
20
26
- <VideoLesson href =" https://vueschool.io/lessons/defining-custom-events-emits?friend=vuejs " title =" Learn how to define which events a component can emit with Vue School" >Watch a free video about Defining Custom Events on Vue School</VideoLesson >
21
+ <VideoLesson href =" https://vueschool.io/lessons/defining-custom-events-emits?friend=vuejs " title =" Vue School でコンポーネントが発行できるイベントを定義する方法を学ぶ " > Vue School でカスタムイベントの定義についての無料ビデオを視聴する </VideoLesson >
27
22
28
23
発行されたイベントは、 ` emits ` オプションを介して、コンポーネントで定義することが出来ます。
29
24
@@ -33,8 +28,7 @@ app.component('custom-form', {
33
28
})
34
29
```
35
30
36
-
37
- ネイティブイベント(例、 ` click ` など)が ` emits ` オプションで定義されている場合、ネイティブリスナーとして扱われるのではなく、コンポーネントのイベントによって上書きされます。
31
+ ネイティブイベント(例、 ` click ` など)が ` emits ` オプションで定義されている場合、ネイティブイベントリスナの ** 代わりに** コンポーネントのイベントが使われます。
38
32
39
33
::: tip
40
34
コンポーネントの動作を実証するために、全ての発行されたイベントを定義することをお勧めします。
@@ -63,7 +57,7 @@ app.component('custom-form', {
63
57
}
64
58
},
65
59
methods: {
66
- submitForm () {
60
+ submitForm (email , password ) {
67
61
this .$emit (' submit' , { email, password })
68
62
}
69
63
}
@@ -75,28 +69,28 @@ app.component('custom-form', {
75
69
デフォルトでは、コンポーネントの ` v-model ` はプロパティとして ` modelValue ` を使用し、イベントとして ` update:modelValue ` を使用します。` v-model ` 引数を渡してこれらの名前の変更が出来ます。
76
70
77
71
``` html
78
- <my-component v-model:foo = " bar " ></my-component >
72
+ <my-component v-model:title = " bookTitle " ></my-component >
79
73
```
80
- この場合、子コンポーネントは ` foo ` プロパティを期待し、同期するために ` update:foo ` イベントを発行します。
81
74
82
- ``` js
83
- const app = Vue .createApp ({})
75
+ この場合、子コンポーネントは ` title ` プロパティを期待し、同期するために ` update:title ` イベントを発行します。
84
76
77
+ ``` js
85
78
app .component (' my-component' , {
86
79
props: {
87
- foo : String
80
+ title : String
88
81
},
82
+ emits: [' update:title' ],
89
83
template: `
90
84
<input
91
85
type="text"
92
- :value="foo "
93
- @input="$emit('update:foo ', $event.target.value)">
86
+ :value="title "
87
+ @input="$emit('update:title ', $event.target.value)">
94
88
`
95
89
})
96
90
```
97
91
98
92
``` html
99
- <my-component v-model:foo = " bar " ></my-component >
93
+ <my-component v-model:title = " bookTitle " ></my-component >
100
94
```
101
95
102
96
## 複数の ` v-model ` のバインディング
@@ -113,13 +107,12 @@ app.component('my-component', {
113
107
```
114
108
115
109
``` js
116
- const app = Vue .createApp ({})
117
-
118
110
app .component (' user-name' , {
119
111
props: {
120
112
firstName: String ,
121
113
lastName: String
122
114
},
115
+ emits: [' update:firstName' , ' update:lastName' ],
123
116
template: `
124
117
<input
125
118
type="text"
@@ -138,16 +131,16 @@ app.component('user-name', {
138
131
139
132
## ` v-model ` 修飾子の処理
140
133
141
- フォーム入力バインディングについて学習していたときに、 ` v-model ` に [ 組み込み修飾子] ( /guide/forms.html#modifiers ) -` .trim ` 、 ` .number ` 、および ` .lazy ` があることがわかりました。ただし、場合によっては、独自のカスタム修飾子を追加することもできます。
134
+ フォーム入力バインディングについて学習していたときに、 ` v-model ` に [ 組み込み修飾子] ( /guide/forms.html#modifiers ) - ` .trim ` 、 ` .number ` 、および ` .lazy ` があることがわかりました。ただし、場合によっては、独自のカスタム修飾子を追加することもできます。
142
135
143
- ` v-model ` バインディングによって提供される文字列の最初の文字を大文字にするカスタム修飾子の例、` capitalize ` を作成してみましょう。
136
+ ` v-model ` バインディングによって提供される文字列の最初の文字を大文字にするカスタム修飾子の例、` capitalize ` を作成してみましょう。
144
137
145
138
コンポーネント ` v-model ` に追加された修飾子は、` modelModifiers ` プロパティを介してコンポーネントに提供されます。以下の例では、デフォルトで空のオブジェクトになる ` modelModifiers ` プロパティを含むコンポーネントを作成しました。
146
139
147
- コンポーネントの ` created ` ライフサイクルフックがトリガーされると、` modelModifiers ` プロパティには ` capitalize ` が含まれ、その値は` true ` になります。これは、 ` v-model ` バインディングに ` v-model.capitalize = "var " ` が設定されているためです。
140
+ コンポーネントの ` created ` ライフサイクルフックがトリガーされると、` modelModifiers ` プロパティには ` capitalize ` が含まれ、その値は ` true ` になります。これは、 ` v-model ` バインディングに ` v-model.capitalize="myText " ` が設定されているためです。
148
141
149
142
``` html
150
- <my-component v-model.capitalize =" bar " ></my-component >
143
+ <my-component v-model.capitalize =" myText " ></my-component >
151
144
```
152
145
153
146
``` js
@@ -158,6 +151,7 @@ app.component('my-component', {
158
151
default : () => ({})
159
152
}
160
153
},
154
+ emits: [' update:modelValue' ],
161
155
template: `
162
156
<input type="text"
163
157
:value="modelValue"
@@ -194,6 +188,7 @@ app.component('my-component', {
194
188
default : () => ({})
195
189
}
196
190
},
191
+ emits: [' update:modelValue' ],
197
192
methods: {
198
193
emitValue (e ) {
199
194
let value = e .target .value
@@ -215,19 +210,20 @@ app.mount('#app')
215
210
引数を持つ ` v-model ` バインディングの場合、生成されるプロパティ名は ` arg + "Modifiers" ` になります。
216
211
217
212
``` html
218
- <my-component v-model:foo .capitalize =" bar " ></my-component >
213
+ <my-component v-model:description .capitalize =" myText " ></my-component >
219
214
```
220
215
221
216
``` js
222
217
app .component (' my-component' , {
223
- props: [' foo' , ' fooModifiers' ],
218
+ props: [' description' , ' descriptionModifiers' ],
219
+ emits: [' update:description' ],
224
220
template: `
225
221
<input type="text"
226
- :value="foo "
227
- @input="$emit('update:foo ', $event.target.value)">
222
+ :value="description "
223
+ @input="$emit('update:description ', $event.target.value)">
228
224
` ,
229
225
created () {
230
- console .log (this .fooModifiers ) // { capitalize: true }
226
+ console .log (this .descriptionModifiers ) // { capitalize: true }
231
227
}
232
228
})
233
229
```
0 commit comments