事件名
不同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。
1 | this.$emit('myEvent') |
DOM 模板会自动转换事件名为全小写 (因为 HTML 是大小写不敏感的),所以 @myEvent
将会变成 @myevent
——导致 myEvent
不可能被监听到。
因此,我们推荐你始终使用 kebab-case 的事件名。
定义自定义事件
可以通过 emits
选项在组件上定义已发出的事件。
1 | app.component('custom-form', { |
当在 emits
选项中定义了原生事件 (如 click
) 时,将使用组件中的事件替代原生事件侦听器。
建议定义所有发出的事件,以便更好地记录组件应该如何工作。
验证抛出的事件
要添加验证,将为事件分配一个函数,该函数接收传递给 $emit
调用的参数,并返回一个布尔值以指示事件是否有效。
1 | <template> |
经测试:验证失败并不阻止 submitChild 事件支持
v-model
参数
默认情况下,组件上的 v-model
使用 modelValue
作为 prop 和 update:modelValue
作为事件。我们可以通过向 v-model
传递参数来修改这些名称。子组件将需要一个 title
prop 并发出 update:title
要同步的事件。
1 | // 父组件 |
多个 v-model
绑定
我们现在可以在单个组件实例上创建多个 v-model 绑定。每个 v-model 将同步到不同的 prop,而不需要在组件中添加额外的选项:
1 | // 父组件 |
处理 v-model
修饰符
在 3.x 中,添加到组件 v-model
的修饰符将通过 modelModifiers
prop 提供给组件:
让我们创建一个示例自定义修饰符 capitalize
,它将 v-model
绑定提供的字符串的第一个字母大写。
添加到组件 v-model
的修饰符将通过 modelModifiers
prop 提供给组件。在下面的示例中,我们创建了一个组件,其中包含默认为空对象的 modelModifiers
prop。
请注意,当组件的
created
生命周期钩子触发时,modelModifiers
prop 包含capitalize
,其值为true
——因为它被设置在v-model
绑定v-model.capitalize="bar"
。
1 | <template> |
现在我们已经设置了 prop,我们可以检查 modelModifiers
对象键并编写一个处理器来更改发出的值。在下面的代码中,每当 <input/>
元素触发 input
事件时,我们都将字符串大写。
1 | <template> |
对于带参数的
v-model
绑定,生成的 prop 名称将为arg + "Modifiers"