自定义事件 |
您所在的位置:网站首页 › vue3如何自定义注册事件 › 自定义事件 |
关注 前端布道师 回复 6 入500人前端群,与大厂大佬讨论技术. # 自定义事件该页面假设你已经阅读过了组件基础。如果你还对组件不太了解,推荐你先阅读它。 # 事件名不同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。 this.$emit('my-event') 1 1如果我们触发一个 camelCase 名字的事件: this.$emit('myEvent') 1则监听这个名字的 kebab-case 版本是不会有任何效果的: 12不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或 property 名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 @myEvent 将会变成 @myevent——导致 myEvent 不可能被监听到。 因此,我们推荐你始终使用 kebab-case 的事件名。 # 定义自定义事件 在 Vue School 上观看关于定义自定义事件的免费视频。可以通过 emits 选项在组件上定义已发出的事件。 app.component('custom-form', { emits: ['in-focus', 'submit'] }) 123当在 emits 选项中定义了原生事件 (如 click) 时,将使用组件中的事件替代原生事件侦听器。 TIP 建议定义所有发出的事件,以便更好地记录组件应该如何工作。 # 验证抛出的事件与 prop 类型验证类似,如果使用对象语法而不是数组语法定义发出的事件,则可以验证它。 要添加验证,将为事件分配一个函数,该函数接收传递给 $emit 调用的参数,并返回一个布尔值以指示事件是否有效。 app.component('custom-form', { emits: { // 没有验证 click: null, // 验证submit 事件 submit: ({ email, password }) => { if (email && password) { return true } else { console.warn('Invalid submit event payload!') return false } } }, methods: { submitForm() { this.$emit('submit', { email, password }) } } }) 123456789101112131415161718192021# v-model 参数默认情况下,组件上的 v-model 使用 modelValue 作为 prop 和 update:modelValue 作为事件。我们可以通过向 v-model 传递参数来修改这些名称: 1在本例中,子组件将需要一个 title prop 并发出 update:title 要同步的事件: app.component('my-component', { props: { foo: String }, emits: ['update:title'], template: ` ` }) 123456789101112 1# 多个 v-model 绑定通过利用以特定 prop 和事件为目标的能力,正如我们之前在 v-model 参数中所学的那样,我们现在可以在单个组件实例上创建多个 v-model 绑定。 每个 v-model 将同步到不同的 prop,而不需要在组件中添加额外的选项: 1234app.component('user-name', { props: { firstName: String, lastName: String }, emits: ['update:firstName', 'update:lastName'], template: ` ` }) 123456789101112131415161718See the Pen Multiple v-models by Vue (@Vue) on CodePen. # 处理 v-model 修饰符在 2.x 中,我们对组件 v-model 上的 .trim 等修饰符提供了硬编码支持。但是,如果组件可以支持自定义修饰符,则会更有用。在 3.x 中,添加到组件 v-model 的修饰符将通过 modelModifiers prop 提供给组件: 当我们学习表单输入绑定时,我们看到 v-model 有内置修饰符——.trim、.number 和 .lazy。但是,在某些情况下,你可能还需要添加自己的自定义修饰符。 让我们创建一个示例自定义修饰符 capitalize,它将 v-model 绑定提供的字符串的第一个字母大写。 添加到组件 v-model 的修饰符将通过 modelModifiers prop 提供给组件。在下面的示例中,我们创建了一个组件,其中包含默认为空对象的 modelModifiers prop。 请注意,当组件的 created 生命周期钩子触发时,modelModifiers prop 包含 capitalize,其值为 true——因为它被设置在 v-model 绑定 v-model.capitalize="bar"。 1app.component('my-component', { props: { modelValue: String, modelModifiers: { default: () => ({}) } }, emits: ['update:modelValue'], template: ` `, created() { console.log(this.modelModifiers) // { capitalize: true } } }) 1234567891011121314151617现在我们已经设置了 prop,我们可以检查 modelModifiers 对象键并编写一个处理器来更改发出的值。在下面的代码中,每当 元素触发 input 事件时,我们都将字符串大写。 {{ myText }} 1234const app = Vue.createApp({ data() { return { myText: '' } } }) app.component('my-component', { props: { modelValue: String, modelModifiers: { default: () => ({}) } }, methods: { emits: ['update:modelValue'], emitValue(e) { let value = e.target.value if (this.modelModifiers.capitalize) { value = value.charAt(0).toUpperCase() + value.slice(1) } this.$emit('update:modelValue', value) } }, template: `` }) app.mount('#app') 1234567891011121314151617181920212223242526272829303132对于带参数的 v-model 绑定,生成的 prop 名称将为 arg + "Modifiers": 1app.component('my-component', { props: ['description', 'descriptionModifiers'], emits: ['update:description'], template: ` `, created() { console.log(this.descriptionModifiers) // { capitalize: true } } }) 123456789101112加入前端布道师交流群 扫描二维码回复 加群 学习,与大厂大佬讨论技术. ← 非 Prop 的 Attribute 插槽 → |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |