在 Vue3 + Element Plus 中,子组件的 $emit
失效可能有以下几种原因:
setup()
函数,this
在 setup 中不可用在 Vue3 组合式 API 中:
// 子组件
import { defineEmits } from 'vue'
export default {
setup(props, { emit }) {
const handleClick = () => {
emit('custom-event', 'data') // 正确方式
// this.$emit('custom-event', 'data') // 错误,setup 中没有 this
}
return { handleClick }
}
}
Vue3 会自动将事件名转换为小写,推荐:
// 子组件
emit('customEvent') // 发射
// 父组件
<child-component @custom-event="handler" /> <!-- 监听时使用短横线命名 -->
确保父组件正确监听:
<!-- 父组件模板 -->
<template>
<child-component @custom-event="handleCustomEvent" />
</template>
<script>
export default {
methods: {
handleCustomEvent(data) {
console.log('收到数据:', data)
}
}
}
</script>
对于 Element Plus 组件,可能需要使用 .native
修饰符(Vue3 中已移除)或正确的事件名:
<el-button @click="handleClick">按钮</el-button>
<!-- 对于自定义事件 -->
<el-component @custom-event="handler" />
Vue3 推荐使用 defineEmits
明确声明组件会发出的事件:
// 子组件
const emit = defineEmits(['update', 'delete'])
function updateData() {
emit('update', newData)
}
<template>
<el-button @click="triggerEvent">触发事件</el-button>
</template>
<script>
import { defineEmits } from 'vue'
export default {
setup() {
const emit = defineEmits(['custom-event'])
const triggerEvent = () => {
emit('custom-event', { message: 'Hello from child' })
}
return { triggerEvent }
}
}
</script>
<template>
<child-component @custom-event="handleEvent" />
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
components: { ChildComponent },
methods: {
handleEvent(payload) {
console.log('收到子组件事件:', payload)
}
}
}
</script>
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
如果以上方法都不能解决问题,建议提供更详细的代码示例以便进一步诊断。