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

VueJS奇怪$emit行为:自定义事件从非预期组件触发问题

问题成因
  • 核心原因是全局变量污染:你在device-showcurrent组件的mounted钩子中直接写instance = this,没有用let/const/var声明变量,这会导致instance被自动注册为window下的全局变量。如果bootstrap-table组件的内部代码也用了同样的无声明赋值写法,全局的instance会被覆盖为bootstrap-table的组件实例。等到模态框触发hide.bs.modal事件时,回调里执行的instance.$emit实际是调用bootstrap-table实例的emit方法,自然事件就会从bootstrap-table组件抛出。
  • 次要排查方向:如果确认不存在全局变量污染,可以检查device-showcurrent的模态框DOM是否被意外挂载到了bootstrap-table的DOM树内部,且bootstrap-table做了自定义事件的转发处理,不过该场景出现概率极低。
修复方案

你当前的代码其实完全不需要额外定义instance变量:事件回调已经用了箭头函数,this默认指向当前组件实例,直接修改成以下代码即可:

mounted: function(){
    // 该ID在组件创建时生成,运行正常,已确认该JQuery事件可正常触发
    $(`#${this.randomID}`).on('hide.bs.modal', e => {
        this.$emit('modal-close')
    })
}

如果确实需要跨作用域存储组件实例,一定要用块级作用域声明变量,避免污染全局命名空间:

mounted: function(){
    const instance = this // 加const声明为局部变量
    $(`#${this.randomID}`).on('hide.bs.modal', e => {
        instance.$emit('modal-close')
    })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:54:03