Vue3:如何在 parent DOM 上接收@click 事件?

Vue3: How to receive @click event on parent DOM?

我在 Vue3 模板中有以下结构:

template:
/*html*/
`<div class='element1' @click='onClick'>
    <img :src='image_url' />
    <p>{{desc_text}}</p>
</div>`,
data() {
    return {
        image_url: "path/to/image",
        desc_text: "Some text goes here"
    }
},
methods: {
    onClick(e) {
        console.log(e);
    }
}

根据我点击的位置,控制台输出 e.target<img><p><div class='element1'>,并且 e.path 设置为元素数组,从指针下方最顶端的元素到 bottom-most,而 currentTarget 设置为 null.

我正在寻找一种解决方案,其中将使用 e.target 调用事件处理程序,该事件处理程序指向添加了 @click 侦听器的元素,在本例中为 <div class='element1'>。不要指向它的任何一个 children.

我一直在查看有关事件气泡的 Vue3 文档,但到目前为止没有任何修饰符符合我的需要。

例如 @click.self 仅当 e.target 是具有事件侦听器的元素时才会触发,但是,如果指针位于其任何 children 之上,则不会触发。

现在,我在所有 children 元素上使用 pointer-events: none; 样式 我不想有自己的指针事件处理,它似乎有 sufficient coverage。但是,如果 Vue 本身没有任何选项来处理这种情况,我会感到很惊讶,也许我错过了它?

我已经通读了 Vue3 Event Modifiers 文档,但其中没有列出任何选项。

在某些情况下,我在一个元素中有十几个 sub-elements(例如,一张显示图像、标题、段落等的卡片),我希望整个元素都是一个大按钮,可以点击打开,只设置了一个 @click 事件处理程序。

您可以在不使用事件目标但将参数传递给 onClick 处理程序的情况下获得相同的结果(可能更好)。

渲染可点击列表时我通常做的是传递整个项目

<div v-for="element in elements" :key="'element' + item.id" class="'element' + element.id" @click="onClick(element)">
    <img :src='element.image_url' />
    <p>{{element.desc_text}}</p>
</div>

然后处理 onclick 变得容易,因为您已经拥有了您想要的元素

onClick(element) {
    console.log(element);
}