diff --git a/src/guide/component-custom-events.md b/src/guide/component-custom-events.md index a30e3518..3228e525 100644 --- a/src/guide/component-custom-events.md +++ b/src/guide/component-custom-events.md @@ -4,26 +4,21 @@ ## イベント名 -コンポーネントやプロパティとは違い、イベント名の大文字と小文字は自動的に変換されません。その代わり発火されるイベント名とイベントリスナ名は全く同じにする必要があります。例えばキャメルケース(camelCase)のイベント名でイベントを発火した場合: +コンポーネントやプロパティと同じように、イベント名は大文字と小文字を自動的に変換します。子コンポーネントからキャメルケースでイベントを発行すると、親コンポーネントではケバブケースのリスナを追加できるようになります: ```js this.$emit('myEvent') ``` -ケバブケース(kebab-case)でリスナ名を作っても何も起こりません: - ```html - ``` -イベント名は JavaScript 内で変数やプロパティ名として扱われることはないので、キャメルケース(camelCase)またはパスカルケース(PascalCase)を使用する理由はありません。 さらに DOM テンプレート内の `v-on` イベントリスナは自動的に小文字に変換されます ( HTML が大文字と小文字を判別しないため)。このため `@myEvent` は `@myevent` になり `myEvent` にリスナが反応することができなくなります。 - -こういった理由から **いつもケバブケース(kebab-case)を使うこと** をお薦めします。 +[プロパティの形式](/guide/component-props.html#プロパティの形式-キャメルケース-vs-ケバブケース) と同じように、DOM 内テンプレートを使っている場合は、ケバブケースのイベントリスナを使うことをお勧めします。文字列テンプーとを使っている場合は、この制約は適用されません。 ## カスタムイベントの定義 -Watch a free video about Defining Custom Events on Vue School +Vue School でカスタムイベントの定義についての無料ビデオを視聴する 発行されたイベントは、 `emits` オプションを介して、コンポーネントで定義することが出来ます。 @@ -33,8 +28,7 @@ app.component('custom-form', { }) ``` - -ネイティブイベント(例、 `click` など)が `emits` オプションで定義されている場合、ネイティブリスナーとして扱われるのではなく、コンポーネントのイベントによって上書きされます。 +ネイティブイベント(例、 `click` など)が `emits` オプションで定義されている場合、ネイティブイベントリスナの **代わりに** コンポーネントのイベントが使われます。 ::: tip コンポーネントの動作を実証するために、全ての発行されたイベントを定義することをお勧めします。 @@ -63,7 +57,7 @@ app.component('custom-form', { } }, methods: { - submitForm() { + submitForm(email, password) { this.$emit('submit', { email, password }) } } @@ -75,28 +69,28 @@ app.component('custom-form', { デフォルトでは、コンポーネントの `v-model` はプロパティとして `modelValue` を使用し、イベントとして `update:modelValue` を使用します。`v-model` 引数を渡してこれらの名前の変更が出来ます。 ```html - + ``` -この場合、子コンポーネントは `foo` プロパティを期待し、同期するために `update:foo` イベントを発行します。 -```js -const app = Vue.createApp({}) +この場合、子コンポーネントは `title` プロパティを期待し、同期するために `update:title` イベントを発行します。 +```js app.component('my-component', { props: { - foo: String + title: String }, + emits: ['update:title'], template: ` + :value="title" + @input="$emit('update:title', $event.target.value)"> ` }) ``` ```html - + ``` ## 複数の `v-model` のバインディング @@ -113,13 +107,12 @@ app.component('my-component', { ``` ```js -const app = Vue.createApp({}) - app.component('user-name', { props: { firstName: String, lastName: String }, + emits: ['update:firstName', 'update:lastName'], template: ` + ``` ```js @@ -158,6 +151,7 @@ app.component('my-component', { default: () => ({}) } }, + emits: ['update:modelValue'], template: ` ({}) } }, + emits: ['update:modelValue'], methods: { emitValue(e) { let value = e.target.value @@ -215,19 +210,20 @@ app.mount('#app') 引数を持つ `v-model` バインディングの場合、生成されるプロパティ名は `arg + "Modifiers"` になります。 ```html - + ``` ```js app.component('my-component', { - props: ['foo', 'fooModifiers'], + props: ['description', 'descriptionModifiers'], + emits: ['update:description'], template: ` + :value="description" + @input="$emit('update:description', $event.target.value)"> `, created() { - console.log(this.fooModifiers) // { capitalize: true } + console.log(this.descriptionModifiers) // { capitalize: true } } }) ```