许多Vue模式涉及使用道具将数据从父组件传递到子组件。但是如果我们需要一个子组件将数据传递给它的父组件怎么办?使用emit我们可以触发事件并将数据传递到组件层次结构中。这在多种情况下很有用,例如:从输入中发射数据从模态本身内部关闭模态响应子组件的父组件VueEmit是如何工作的?当我们发出一个事件时,我们调用一个带有一个或多个参数的方法:eventName:string-事件的名称值:any-通过事件传递的参数下面是一个内联发出的例子,.发出一个名为add的事件,并将Math.random()的值作为参数传递。然后,在父组件中使用v-on或@指令来监听我们自定义的add事件并接收参数值。Child.vue在**Parent.vue**监听中添加Math.random():count+=i"/>Count:{{count}}/template>每次我们点击按钮时,Child.vue都会发出一个add事件,其值在0到1之间。然后,Parent.vue捕获此事件并将此值添加到计数中。可以传递任意数量的参数,监听器将接收所有参数:Child-$emit('add',Math.random(),44,50)Parent-@add="(i,j,k)=>count+=i+j+k"现在,我们知道如何在模板中发出内联事件,但在更复杂的示例中,如果我们从SFC脚本发出事件会更好。这在我们想要在发出事件之前执行一些逻辑时尤其有用。在Vue3中,我们有2种不同的方法来做到这一点:OptionsAPI-this.$emitCompositionAPIwithsetup()-context.emitCompositionAPIwithexportdefault{methods:{handleChange(event){this.$emit("customChange",event.target.value.toUpperCase())}}}我的自定义输入在Parent.vue中收到:我的自定义输入ComposingAPIwithsetup()-context.emit在CompositionAPI中,如果使用了setup函数,则不能再使用this,即你不能调用this.$emit()方法。相反,可以使用setup方法中的第二个参数context访问emit方法。我们可以使用之前使用的事件名称和值调用context.emit。MyTextInput.vue我的自定义输入但是,如果我们传递一个对象,我们可以为每个事件添加一个验证器函数,我们可以在其中检查值是否符合我们需要的格式。像事件侦听器一样,验证器接受我们传入的所有参数。这类似于prop验证,如果我们的验证器返回false,我们将在控制台中收到警告,这为我们提供了一些有用的信息。MyTextInput.vue使用emits定义自定义事件的最佳实践如果我们不使用defineEmits,我们仍然可以通过在exportdefault中定义emits选项来跟踪组件的自定义事件。这对于维护良好的组件文档很重要,如果我们尝试使用未在emits中声明的事件,我们也会从Vue收到错误。当在emits选项中定义了本机事件(例如更改)时,将使用来自组件的事件而不是本机事件侦听器。MyCustomInput正确的事件命令在vue3中,像组件和道具一样,事件名称提供自动大小写转换。如果您在子组件中触发驼峰命名事件,您将能够在父组件中添加一个kebab-case侦听器。但是,如果您使用的是Vue2,事件名称没有自动大小写转换,并且由于v-on指令会自动将您的事件名称转换为小写,因此无法监听驼峰命名的事件。例如,如果我们发出一个名为myEvent的事件,则监听my-event将不起作用。作者:Noveo译者:小智来源:learnvue原文:https://learnvue.co/tutorals/vue-emit-guide
Count:{{count}}
Vue3$emit指南-包括选项API、组合API和设置语法糖相关文章