本文深入分析在Vue项目中使用Vuex时遇到this.$store为undefined的常见原因。重点讲解在then回调或普通函数中this指向丢失的问题,并提供将普通函数替换为箭头函数的具体解决方案,同时对比两种修复代码写法,帮助开发者快速定位并修复该错误。
在使用Vuex进行状态管理时,开发者可能会遇到this.$store返回undefined的情况,导致无法访问状态或提交Mutation。
本文主要探讨该问题出现的具体业务场景。

例如,在组件方法open_show内部调用update_info时,系统抛出undefined错误,导致功能中断。
面对此类问题,排查思路通常从搜索常见报错入手。
初学者遇到此问题时,往往先搜索“this.$store.state为undefined”,但此类通用方案往往无法直接解决当前特定场景。尝试检查项目目录结构也未见成效,最终通过打印this对象发现,问题根源在于this的指向发生了偏移。
针对this指向异常,主要有两种代码层面的解决策略。
第一种方案是通过保存this引用。
methods: {
update_info:function(self,data){
alert(self.$store);
self.$store.commit("info",data);
},
open_show: function () {
var self =this;
this.update_info(self,this.flag);
}
}第二种方案是利用闭包或外部变量保存上下文。
var self =this;
export default {
methods: {
update_info:function(data){
alert(self.$store);
self.$store.commit("info",data);
},
open_show: function () {
this.update_info(this.flag);
}
},
created(){
self = this;
}
}上述两种方法均针对特定调用场景。若该方法在多处被公用调用,推荐采用第二种方式,因为第一种方式在方法复用时需要额外修改参数传递逻辑;若仅为单次或简单调用,第一种方式更为直观便捷。
另一个常见场景是在Vuex中处理token时,this.$store持续显示为undefined。

控制台报错信息通常为:Cannot read properties of undefined(reading '$store') at eval。
此处先给出直接的修复手段,随后展开详细的原因分析。
核心修复手段是将Promise链中then()回调内的普通函数替换为箭头函数。
该报错的根本原因在于JavaScript中this的指向机制。
具体错误代码示例如下。

深入分析报错产生的底层原因。
首先,在main.js文件中对$store进行打印输出,以确认store是否已成功注册到Vue实例中。

观察控制台打印结果。

若控制台能成功打印出$store,则证明store已正确存在于Vue实例中,从而排除Vuex安装失败或store未注册到实例的可能性。
接着观察代码中调用store的方式——直接使用了this.$store。此时需怀疑该处的this是否仍指向Vue实例。查阅Vue官方文档后,找到关键说明。
All lifecycle hooks are called with their 'this' context pointing to the Vue instance invoking it.
这意味着,在Vue的所有生命周期钩子(如created、mounted、updated及destroyed)中,this明确指向调用该钩子的Vue实例,即(new Vue)对象。
然而,在then()回调中使用了普通函数,普通函数内部的this并不指向Vue实例,因此无法通过this访问到vue.$store。
将普通函数替换为箭头函数后,由于箭头函数自身没有this绑定,其this继承自外层作用域,因此箭头函数内的this正确指向new Vue(即定义的myVue实例),从而可以正常使用this.$store。
修复后的代码示例如下。

总结全文要点。
以上为基于实际开发经验的总结,旨在提供排查参考,欢迎读者反馈与支持。