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

VueJS:如何在mounted钩子中访问Vuex Store数据?

问题分析与解决方案

嘿,我一眼就瞅出问题所在啦!你遇到的这个报错,核心原因是**socket.on回调函数里的this指向不对**——你用普通function()定义回调时,函数内部的this已经不再指向Vue组件实例了,自然找不到$store;而testEvent里直接用this没问题,是因为它本身就在Vue方法的上下文里,this还是组件实例。

下面给你三种常用的解决办法,选顺手的用就行:

方法1:使用箭头函数(推荐,简洁直观)

箭头函数不会绑定自己的this,会继承外层上下文的this(也就是你的Vue组件实例),直接改回调写法就行:

methods: {
  testEvent() { 
    let players = this.$store.state.players;
    console.log(players);
  },
  socketEvent() { 
    socket.on('dice_data', (data) => { // 改成箭头函数
      let players = this.$store.state.players;
      console.log(players);
    });
  }
},
mounted() { 
  this.socketEvent() 
}

方法2:提前保存组件实例的this

在回调外面先把组件实例的this存成变量,比如vm或者that,然后在回调里用这个变量代替this:

methods: {
  testEvent() { 
    let players = this.$store.state.players;
    console.log(players);
  },
  socketEvent() { 
    const vm = this; // 先把组件实例的this存起来
    socket.on('dice_data', function(data) {
      let players = vm.$store.state.players; // 用vm代替this
      console.log(players);
    });
  }
},
mounted() { 
  this.socketEvent() 
}

方法3:用bind绑定this

给回调函数手动绑定组件实例的this,确保回调内部的this指向正确:

methods: {
  testEvent() { 
    let players = this.$store.state.players;
    console.log(players);
  },
  socketEvent() { 
    socket.on('dice_data', function(data) {
      let players = this.$store.state.players;
      console.log(players);
    }.bind(this)); // 绑定组件实例的this
  }
},
mounted() { 
  this.socketEvent() 
}

这三种方法里,箭头函数是现在Vue项目里最常用的写法,简洁又不容易出错,优先推荐第一种哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:17:58