Vue3值得注意的新特性之——触发组件选项

事件名

与组件和prop一样,事件名提供了自动的大小写转换。如果用驼峰命名的子组件中触发一个事件,你将可以在父组件中添加一个kebabcase(短横线分割命名)的监听器。

 
 
 
 
  1.   
  2. this.$emit('myEvent') 

与props命名一样,当你使用DOM模板时,我们建议使用kebabcase事件监听器。如果你使用的是字符串模板,这个限制就不适用。

定义自定义事件

可以通过emits选项在组件上定义已发出的事件。

 
 
 
 
  1. app.component('custom-form', { 
  2.   emits: ['inFocus', 'submit'] 
  3. }) 

当在emits选项中定义了原生事件(如click)时,将使用组件中的事件替代原生事件侦听器。

验证抛出的事件

与props类型验证类似,如果使用对象语法而不是数组语法,则可以验证它。

要添加验证,将为事件分配一个函数,该函数接收传递给$emit调用的参数,并返回一个布尔值以指示事件是否有效。

 
 
 
 
  1. app.component('custom-form', { 
  2.   emits: { 
  3.     // 没有验证 
  4.     click: null, 
  5.  
  6.     // 验证submit 事件 
  7.     submit: ({ email, password }) => { 
  8.       if (email && password) { 
  9.         return true 
  10.       } else { 
  11.         console.warn('Invalid submit event payload!') 
  12.         return false 
  13.       } 
  14.     } 
  15.   }, 
  16.   methods: { 
  17.     submitForm() { 
  18.       this.$emit('submit', { email, password }) 
  19.     } 
  20.   } 
  21. }) 

v-model事件

默认情况下,组件上的v-model使用modelValue作为props和update:modelValue做完事件。我们可以通过向v-model传递参数来修改这些名称:

 
 
 
 
  1.  

在本例中,子组件将需要一个 title prop 并发出 update:title 要同步的事件:

 
 
 
 
  1. app.component('my-component', { 
  2.   props: { 
  3.     title: String 
  4.   }, 
  5.   emits: ['update:title'], 
  6.   template: ` 
  7.     
  8.       type="text" 
  9.       :value="title" 
  10.       @input="$emit('update:title', $event.target.value)"> 
  11.   ` 
  12. }) 

多个v-model绑定

通过利用特定prop和事件为目标的能力,正如我们之前在v-model参数中所学的那样,我们现在可以在单个组件实例上创建多个v-model绑定。

每个v-model将同步到不同的prop,而不需要在组件中添加额外的选项。

 
 
 
 
  1.   v-model:first-name="firstName" 
  2.   v-model:last-name="lastName" 
  3.  
  4. app.component('user-name', { 
  5.   props: { 
  6.     firstName: String, 
  7.     lastName: String 
  8.   }, 
  9.   emits: ['update:firstName', 'update:lastName'], 
  10.   template: ` 
  11.     
  12.       type="text" 
  13.       :value="firstName" 
  14.       @input="$emit('update:firstName', $event.target.value)"> 
  15.  
  16.     
  17.       type="text" 
  18.       :value="lastName" 
  19.       @input="$emit('update:lastName', $event.target.value)"> 
  20.   ` 
  21. }) 

处理v-model修饰词

在2.X中,我们对组件v-model上的.trim等修饰符提供了硬编码支持。但是,如果组件可以支持自定义修饰符,则会更有用。

在3.X中,添加到组件v-model的修饰符将通过modelModifiers prop提供给组件。

v-model有内置的修饰符——.trim,.number和.lazy。但是,在某些情况下,你可能还需要添加自己的自定义修饰符。

我们做个实例:将提供的字符串第一个字母大写。

 
 
 
 
  1.  
  2.  
  3. app.component('my-component', { 
  4.   props: { 
  5.     modelValue: String, 
  6.     modelModifiers: { 
  7.       default: () => ({}) 
  8.     } 
  9.   }, 
  10.   emits: ['update:modelValue'], 
  11.   template: ` 
  12.     
  13.       :value="modelValue" 
  14.       @input="$emit('update:modelValue', $event.target.value)"> 
  15.   `, 
  16.   created() { 
  17.     console.log(this.modelModifiers) // { capitalize: true } 
  18.   } 
  19. }) 

现在我们已经设置了 prop,我们可以检查 modelModifiers 对象键并编写一个处理器来更改发出的值。在下面的代码中,每当 元素触发 input 事件时,我们都将字符串大写。

 
 
 
 
  1.  
  2.    
  3.   {{ myText }} 
 
  •  
  • const app = Vue.createApp({ 
  •   data() { 
  •     return { 
  •       myText: '' 
  •     } 
  •   } 
  • }) 
  •  
  • app.component('my-component', { 
  •   props: { 
  •     modelValue: String, 
  •     modelModifiers: { 
  •       default: () => ({}) 
  •     } 
  •   }, 
  •   emits: ['update:modelValue'], 
  •   methods: { 
  •     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: `
  •     type="text" 
  •     :value="modelValue" 
  •     @input="emitValue">` 
  • }) 
  •  
  • app.mount('#app') 
  • 对于带参数的 v-model 绑定,生成的 prop 名称将为 arg + "Modifiers":

     
     
     
     
    1.  
    2.  
    3. app.component('my-component', { 
    4.   props: ['description', 'descriptionModifiers'], 
    5.   emits: ['update:description'], 
    6.   template: ` 
    7.     
    8.       :value="description" 
    9.       @input="$emit('update:description', $event.target.value)"> 
    10.   `, 
    11.   created() { 
    12.     console.log(this.descriptionModifiers) // { capitalize: true } 
    13.   } 
    14. }) 

    网站标题:Vue3值得注意的新特性之——触发组件选项
    标题链接:http://www.hantingmc.com/qtweb/news14/361414.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    企业网站制作知识

    同城分类信息