Skip to content

3.3 组件事件

3.3.1 触发与监听事件

html
<!-- MyComponent -->
<button @click="$emit('someEvent')">Click Me</button>
<MyComponent @some-event="callback" />
<MyComponent @some-event.once="callback" />

3.3.2 事件参数

html
<button @click="$emit('increaseBy', 1)">
  Increase by 1
</button>

<MyButton @increase-by="(n) => count += n" />
vue
<script setup>
function increaseCount(n) {
  count.value += n
}
</script>
<template>
  <MyButton @increase-by="increaseCount" />
</template>

3.3.3 声明触发的事件

vue
<script setup>
defineEmits(['inFocus', 'submit'])
</script>
vue
<script setup>
const emit = defineEmits(['inFocus', 'submit'])

function buttonClick() {
  emit('submit')
}
</script>

支持对象语法,通过 TypeScript 为参数指定类型,允许我们对触发事件的参数进行验证

vue
<script setup lang="ts">
const emit = defineEmits<{
  (e: 'change', id: number): void
  (e: 'update', value: string): void
}>()
</script>

3.3.4 事件验证

vue
<script setup>
const emit = defineEmits({
  // 没有校验
  click: null,

  // 校验 submit 事件
  submit: ({ email, password }) => {
    if (email && password) {
      return true
    } else {
      console.warn('Invalid submit event payload!')
      return false
    }
  }
})

function submitForm(email, password) {
  emit('submit', { email, password })
}
</script>