Cannot read property ‘$message‘ of undefined

项目:vue+element
场景:在系统登录进行axios调用的时候,如果请求成功会有消息提示框,提示登录成功。
控制台报错:Cannot read property ‘$message’ of undefined

原因:
vue实例中this指的是vue本身,通过this就可以调用vue对象的所有api。
出现上述问题则说明,当前的this对象发生了改变,无法调用$message方法。
箭头函数并不简单是匿名函数的简写:在JS中,箭头函数和匿名函数有一个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了。而匿名函数的this指向运行时实际调用该方法的对象,无法在编写函数时确定this对象指的是哪个对象。

解决办法一var that = this;:

export const login = data => {
    
    
    return request({
    
    
        method: 'post',
        url: '/api/user/login',
        data: data
    })
}

loginBtn() {
    
    
      this.$refs.loginFromRef.validate(async (valid) => {
    
    
        //登录前的一个预验证
        if (!valid) return;
        var that = this;
        login(this.loginForm)
          .then(function (res) {
    
    
            if (res.data.code == "200") {
    
    
              that.$message.success("登录成功");
              window.sessionStorage.setItem("token", res.data.data.token);
              that.$router.push("/layout");
            } else {
    
    
              that.$message.error("登录失败,请检查账号密码是否正确");
            }
          })
          .catch(function () {
    
    
            that.$message.error("登录失败,请检查账号密码是否正确");
          });
      });
    },

解决办法二箭头函数:

箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止

export const login = data => {
    
    
    return request({
    
    
        method: 'post',
        url: '/api/user/login',
        data: data
    })
}

loginBtn() {
    
    
      this.$refs.loginFromRef.validate(async (valid) => {
    
    
        //登录前的一个预验证
        if (!valid) return;
        login(this.loginForm)
          .then(res => {
    
    
            if (res.data.code == "200") {
    
    
              this.$message.success("登录成功");
              window.sessionStorage.setItem("token", res.data.data.token);
              this.$router.push("/layout");
            } else {
    
    
              this.$message.error("登录失败,请检查账号密码是否正确");
            }
          })
          .catch( (error)=> {
    
    
            this.$message.error("登录失败,请检查账号密码是否正确");
          });
      });
    },

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/114584169