触发和监听
- 使用
kebab-case命名事件 自动转化: 如果你在子组件中触发了一个叫做myEvent(小驼峰)的事件,那么在父组件中你可以使用v-on:my-event或者@my-event的方式来监听这个事件,即使子组件中触发事件时使用的是myEvent。 - 监听事件可以使用
.once修饰符 只能监听直接子组件触发的事件。平级组件或者跨组件通信应当使用全局状态管理或者外部事件总线。
事件参数
$emit('emitName',a) 触发事件可以传一个参数,这个参数会被传递给监听器触发的箭头函数:
html
<MyButton @increase-by="(n) => count += n" />
-->或者传递给组件方法的参数
<MyButton @increase-by="increaseCount" />ts
function increaseCount(n) {
count.value += n
}声明组件触发事件
监听器通过 @ 创建的事件只能在 template 中被触发,如果要在 script 中触发的话需要声明该事件:
ts
const emit = defineEmits(['inFocus', 'submit'])通过 emit 会返回一个能够触发这个事件的函数,只要使用 emit('emitName') 即可。
- 如果定义了一个原生 html 拥有的事件,则 vue 会覆盖掉这个事件,只监听自定义的事件。
事件校验
ts
<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>