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

Vue中通过事件监听器更新数据时计算属性未更新问题求助

问题解决:Vue组件中自定义DOM事件触发后计算属性未更新

问题根源

你的代码里,mounted钩子中给document绑定事件时用了普通function作为回调,此时回调里的this指向的是document对象,而非Vue组件实例。所以你赋值的this.option并不是组件data中定义的响应式变量,自然无法触发selectedOption计算属性的更新。

解决方案

有两种简单的修复方式,核心都是确保回调里的this指向Vue组件实例:

方式一:使用箭头函数

箭头函数不会绑定自己的this,会继承外层作用域的this(也就是Vue实例):

export default {
data() {
    return {
        option: null,
    }
},
computed: {
    selectedOption() {
        return this.option
    },
},
mounted() {
    document.addEventListener("newOptionSelected", (event) => {
        this.option = event.detail.option;
        console.log(this.option); // 此时this指向Vue实例,修改的是data中的option
    });
}
}

方式二:提前保存Vue实例的引用

在回调外把Vue实例的this存到变量中,回调里用这个变量访问实例属性:

export default {
data() {
    return {
        option: null,
    }
},
computed: {
    selectedOption() {
        return this.option
    },
},
mounted() {
    const vm = this; // 保存Vue实例引用
    document.addEventListener("newOptionSelected", function(event){
        vm.option = event.detail.option; // 用vm访问data中的option
        console.log(vm.option);
    });
}
}

额外注意

如果后续需要在组件销毁时移除事件监听,避免内存泄漏,可以在beforeUnmount钩子中执行移除操作:

beforeUnmount() {
    // 注意:如果用箭头函数作为回调,需要提前保存回调引用才能移除
    // 所以更推荐方式二的写法,方便后续移除监听
    document.removeEventListener("newOptionSelected", 你的回调函数);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:10:27