You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除子组件元素的mousedown事件?Vue3+TypeScript场景

解决Vue3中子组件内部元素点击触发父组件mousedown事件的问题

问题核心是事件冒泡:点击子组件内的日期选择器或状态选择器时,mousedown事件会向上冒泡到父组件绑定的@mousedown事件,导致意外触发displayProgress方法。以下是几种直接可行的解决方案:

方案一:在子组件内阻止事件冒泡(推荐)

直接在目标选择器上添加@mousedown.stop修饰符,阻止事件向上冒泡到父组件。修改DashboardOrderCard.vue代码:

<el-card>
    <div class="body-wrapper">
        <div class="due-date-wrapper">
            <el-date-picker 
                class="date-picker"
                v-model="currentDueDate" 
                format="DD-MM-YYYY"
                :readonly="isCurrentUserSupervisor === false"
                @mousedown.stop  <!-- 阻止冒泡 -->
            />
        </div>
        <OrderStatusSelect 
            class="status-select"
            v-model:status="currentStatus"
            @mousedown.stop  <!-- 阻止冒泡 -->
        />
    </div>
</el-card>

方案二:自定义组件内部处理冒泡

如果OrderStatusSelect是你开发的自定义组件,也可以在组件内部的根元素上添加阻止冒泡的逻辑,避免在父组件重复写修饰符:

<!-- OrderStatusSelect.vue -->
<template>
    <div class="status-select-container" @mousedown.stop>
        <!-- 组件内部的选择器逻辑 -->
    </div>
</template>

方案三:父组件事件函数内判断目标元素

如果不想修改子组件代码,可以在父组件的事件处理函数中,判断点击目标是否属于选择器元素,若是则跳过执行逻辑:

// DashboardView.vue 的 <script setup>
const displayProgress = (order: OrderType, event: MouseEvent) => {
    const target = event.target as HTMLElement;
    // 检查目标是否是日期选择器/状态选择器或它们的后代元素
    if (target.closest('.date-picker') || target.closest('.status-select')) {
        return;
    }
    // 原本的displayProgress业务逻辑
}

同时修改父组件中事件绑定的写法,传递事件参数:

<DashboardOrderCard 
    v-for="(order, index) in pinnedOrders"
    :key="order.id"
    :id="'order-' + order.id"
    :order="order"
    @mousedown="(e) => displayProgress(order, e)"  <!-- 传递事件对象 -->
    @unpin-order="unpinOrder(index)"
/>

内容的提问来源于stack exchange,提问作者David Gheeorghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:51:26