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

Vue.js组件相互不独立,计数器异常问题求助

问题分析与解决方案

嘿,我一眼就揪出问题所在啦!你遇到的多个compteur组件计数器混乱的情况,核心原因是全局变量污染导致的~

问题根源

你在组件的created钩子中写了self = this;,这里的self没有用let、const或var声明,直接变成了全局变量。当第一个组件创建时,self指向它的实例;但第二个组件创建后,会把全局的self重新赋值成自己的实例。结果就是两个定时器都在修改第二个组件的cptr值——每秒触发两次加1,所以第二个组件每秒加2;而第一个组件的实例再也没被引用到,计数器自然停在0不动。

修复方案

只需要把self变成组件实例内的局部变量就行,给你几种简洁的修复方式:

方式1:用let声明局部变量

Vue.component('compteur',{
  template: '<div>{{cptr}}</div>',
  data(){
    return { cptr:0 }
  },
  created: function() {
    let self = this; // 加上let,把self变成当前组件的局部变量
    setInterval(function() {
      self.cptr +=1;
    }, 1000);
  }
})

vm = new Vue({
  el: "#app",
});

方式2:用箭头函数自动绑定this(更清爽)

箭头函数会自动继承当前上下文的this,根本不需要额外声明self:

Vue.component('compteur',{
  template: '<div>{{cptr}}</div>',
  data(){
    return { cptr:0 }
  },
  created: function() {
    setInterval(() => { // 箭头函数直接用this就行
      this.cptr +=1;
    }, 1000);
  }
})

vm = new Vue({
  el: "#app",
});

可选优化:清除定时器避免内存泄漏

为了更规范,建议在组件销毁时清除定时器,防止内存浪费:

Vue.component('compteur',{
  template: '<div>{{cptr}}</div>',
  data(){
    return { cptr:0 }
  },
  created: function() {
    this.timer = setInterval(() => {
      this.cptr +=1;
    }, 1000);
  },
  beforeDestroy() {
    clearInterval(this.timer); // 组件销毁前清理定时器
  }
})

vm = new Vue({
  el: "#app",
});

修改后每个compteur组件都会拥有独立的计数器,各自每秒加1,完全互不影响啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:34