VUE里面 watch log出来的this,与mounted log出来的this 不一样! 诡异?

    watch:{
      Applist:()=>{
        console.log("Applist改变");
        var _self = this;
        console.log(_self);
        var scroll_area = document.getElementById('scroll_area');
        setTimeout(()=>{
          console.log(_self);
          _self.scrollbar(scroll_area);
        },100)
      }
    },
    mounted: function(){
      let _self=this;
      console.log("log self");
      console.log(_self);
      let scroll_area = document.getElementById('scroll_area');
      _self.getAppList();
      setTimeout(()=>{
        _self.scrollbar(scroll_area);
      },100)
    }

图片描述

图片描述

阅读 3.7k
4 个回答

clipboard.png
其实官方文档有写,都不能用箭头函数的

使用es6箭头函数是vue不会自动绑定this吧

看一下简单的demo

var a = {b: ()=> {console.log(this)}}

var a = {b: function () {console.log(this)}}

就是箭头函数的问题,箭头函数的this是不会绑定的,所有涉及它们的引用,都会沿袭向上查找外层作用域链的方案来处理。
我猜题主是想用es6的形式去写,那就写成下面这样,不用箭头函数,里面用箭头是没问题的

Applist () {
    console.log("Applist改变");
    var _self = this;
    console.log(_self);
    var scroll_area = document.getElementById('scroll_area');
    setTimeout(()=>{
      console.log(_self);
      _self.scrollbar(scroll_area);
    },100)
  }

我也遇到了,我的解决办法是watch里面
Applist:function(){

    console.log("Applist改变");
    var _self = this;
    console.log(_self);
    var scroll_area = document.getElementById('scroll_area');
    setTimeout(()=>{
      console.log(_self);
      _self.scrollbar(scroll_area);
    },100)
  }
},
在watch里面,不推荐使用Applist()=>箭头函数,要用Applist(){},此处用箭头函数this就不再指向Vue实例了,这也是官网推荐的
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题