组件事件

来源: 2024-05-25 16:48:50 播报

触发与监听事件

子组件使用 $emit 方法触发自定义事件。

示例:

<!-- MyComponent -->
<button @click="$emit('someEvent')">Click Me</button>

父组件可以通过 v-on (缩写为 @) 来监听事件。

示例:

<MyComponent @some-event="callback" />

组件的事件监听器也支持 .once 修饰符:。

示例:

<MyComponent @some-event.once="callback" />

事件参数

子组件$emit 提供一个额外的参数。

示例:

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

父组件中监听事件带参数。

1、内联的箭头函数作为监听器

示例:

<MyButton @increase-by="(n) => count  = n" />

2、使用组件方法来作为事件处理函数。

示例:

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

声明触发的事件

1、在 script setup 声明触发的事件

通过 defineEmits() 来声明它要触发的事件,并返回一个与$emit相同作用的函数。

示例:

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

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

2、在setup 函数声明触发的事件

通过 emits 选项来定义,emit 函数也被暴露在 setup() 的上下文对象上。

示例:

export default {
  emits: ['inFocus', 'submit'],
  setup(props, ctx) {
    ctx.emit('submit')
  }
}

TypeScript用法

示例:

<script setup lang="ts">
const emit = defineEmits({
  submit(payload: { email: string, password: string }) {
    // 通过返回值为 `true` 还是为 `false` 来判断
    // 验证是否通过
  }
})
</script>

使用纯类型标注来声明触发的事件。

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

事件校验

要为事件添加校验,那么事件可以被赋值为一个函数,接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

示例:

<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>