Vue3:检查事件监听器是否绑定到组件实例

Tho*_*ore 5 vue.js vuejs3

我有一个可重复使用的徽章组件。我希望能够在组件实例上存在 onDelete 事件侦听器时添加关闭/删除按钮。

<template>
    <div class="flex inline-flex items-center px-2.5 py-0.5 text-xs font-medium select-none" :class="[square ? '' : 'rounded-full']">
        <slot />
        <button class="cursor-pointer ml-2" @click="$emit('onDelete')">
            <XIcon class="flex-shrink-0 h-3.5 w-3.5 text-gray-400 hover:text-gray-500" aria-hidden="true" />
        </button>
    </div>
</template>

<script>
    import { XIcon } from '@heroicons/vue/solid';

    export default {
        props: {
            color: { type: String },
            square: { type: Boolean, default: false },
        },
        components: {
            XIcon,
        },
        emits: ['onDelete'],
    };
</script>
Run Code Online (Sandbox Code Playgroud)

如果我向按钮添加 v-if 语句,则立即执行发出事件

<button v-if="$emit('onDelete')" class="cursor-pointer ml-2" @click="$emit('onDelete')">
Run Code Online (Sandbox Code Playgroud)

我正在使用Vue 3

Tim*_*rom 14

更新:如果您的组件正在使用 Vue3 中的新发出选项(这是 Vue3 文档中推荐的最佳实践),则事件侦听器将不会独立于$attrs. 将向 Vue 团队提交一个问题,以澄清和指导为什么会出现这种情况


我在 StackBlitz 中简化了上面的示例,以隔离您需要的功能。

重要提示,我使用的是 Vue 3.2.26。

在 Vue3 中,$listeners 被删除

事件侦听器现在是$attrs. 然而,简单的控制台登录this.$attrs不会Badge显示您正在查找的密钥,它们位于其中,targets但可以通过添加on绑定事件名称来访问。在您的情况下,Badge您将在组件中使用onOnDelete.

在此输入图像描述

带有两个徽章的完整工作示例。一个会显示,因为它有绑定事件onDelete,另一个不会显示,因为绑定onDelete不存在。

https://stackblitz.com/edit/vue-8b6exq?devtoolsheight=33&file=src/components/Badge.vue