VUE中的this指向性认识不足导致生产故障

在将JSP界面重构为H5的过程中,作者遇到因this指向错误导致的功能失效问题。问题源于newPromise或axios调用后的同步操作。测试显示,箭头函数和bind(this)能解决回调函数中的this指向。文章强调了Vue中异步操作的this管理,推荐使用self或箭头函数避免问题,同时指出对Vue特性的深入理解是关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在对已有JSP界面重构成H5时,遇到了一个很有趣的问题,明明测试通过的界面,过几天回归发现之前的功能都不能用了,打开控制台发现报错了,报错内容大多都是xxxx is undefined,查看代码发现这类问题一般都是因为代码中使用new Pormise或者使用axios调用后台接口后的一些同步操作中出现的问题。那原因大概也能猜到了,就是因为this的指向性导致的。

this指向性测试

1、在箭头函数中使用this,不使用bind(this)
      test11() {
        let params = {
          "req":{
            "queryMonth":202301,
            "querySts":1
          }
        }
        self.$http.qryLawsuitBeforeData(params,(res)=>{
          console.log(this);
        })
      },

结果:
image.png

2、在回调函数中使用this,不使用bind(this)
      test11() {
        let params = {
          "req":{
            "queryMonth":202301,
            "querySts":1
          }
        }
        self.$http.qryLawsuitBeforeData(params,function (res) {
          console.log("回调函数:" + this);
        }, function (error) {
          console.log("回调函数:" + this);
        })

      },

image.png

3、在回调函数中使用this,使用bind(this)
test11() {
        let params = {
          "req":{
            "queryMonth":202301,
            "querySts":1
          }
        }

        self.$http.qryLawsuitBeforeData(params,function (res) {
          console.log("回调函数:" + this);
        }.bind(this), function (error) {
          console.log("回调函数:" + this);
        }.bind(this))
      },

image.png
查看具体的对象是什么

image.png

从以上几个简单的测试案例可以看出,如果在回调函数中使用this,必须要先使用bind绑定参数,同时参数设置为this,这样在回调函数中this才可以正常使用。当然了,使用箭头函数也可以在函数内部使用this。但是要注意ie8不支持箭头函数。

指向性问题解决

回到前言中提到的问题,之前是好的过了几天突然不行了,是为什么,看了一下是被人改坏了,改了之后并没有在最外层new promise函数后bind(this),导致异步函数里面this是undefined。那么如何解决呢,将this换成和上面一样的self即可。

image.png

self是什么?
self是一个全局变量,在vue挂载阶段即将this赋值给self,之后就可以使用self来代替this在程序的任何地方使用了。如果不考虑兼容ie可以直接使用箭头函数,这样就不会出现这种this指向的问题了。

总结

最近在修bug的时候发现这些this指向性问题都是刚开始用vue写代码,由于之前都是使用的jsp,jsp一般都是用ajax的方式,ajax支持同步操作,现在vue使用axios,axios不支持同步,因此没有注意到异步的问题,后期发现问题后,将代码直接复制到new Promise中,然后没有绑定this导致出现这种指向性问题。对vue的一些特性认识不足。还需多写多练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值