自定义事件

342 阅读2分钟

1.事件名

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

  • this.$emit('myEvent')
  • <my-component @my-event="doSomething"></my-component> 与props的命名一样,当使用DOM模板时,建议使用kebab-case事件监听器,如果使用的是字符串模板,这个限制不适用。

2.定义自定义事件

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

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

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

  • 建议定义所有发出的事件,以便更好地记录组件应该如何工作

2.1验证抛出的事件

与prop类型验证类似,如果使用对象语法而不是数组语法定义发出的事件,则可以验证它。要添加验证,将为事件分配一个函数,该函数接收传递给$emit调用的参数,并返回一个布尔值以指示事件是否有效。

app.component('custom-form', {
  emit: {
    //没有验证
    click: null,
    
    //验证submit事件
    submit: ({ email, password }) => {
      if(email && password) {
        return true
      } else {
        console.warn('Invalid submit event payload!')
        return false
      }
    }
  },
  methods: {
    submitForm(email, password) {
      this.$emit('submit', { email, password })
    }
  }
})

3.v-model参数

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

<my-component v-model:title="bookTitle"></my-component>

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

app.component('my-component', {
  props: {
    title: String
  },
  emits: ['update:title'],
  template: `
    <input
      type="text"
      :value="title"
      @input="$emit('update:title', $event.target.value)">
  `
})

4.多个v-model绑定

通过利用以特定prop和事件为目标的能力,我们可以在单个组件实例上创建多个v-model绑定。每个v-model将同步到不同的prop,而不需要在组件中添加额外的选项。

5.处理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,因为capitalize被设置在了写为v-model.capitalize="myText"的v-model绑定上
  • 设置了prop之后我们可以检查modelModifiers对象键并编写一个处理器来更改发出的值
  • 对于带参数的v-model绑定,生成的prop名称将为arg+“Modifiers”