我正在用Vue.js创建一个组件。

当我在任何生命周期挂钩(thiscreatedmounted等)中引用updated时,其评估结果为undefined

mounted: () => {
  console.log(this); // logs "undefined"
},



我的计算属性内部也发生了同样的事情:

computed: {
  foo: () => { 
    return this.bar + 1; 
  } 
}


我得到以下错误:


未被捕获的TypeError:无法读取未定义的属性'bar'


为什么在这种情况下this评估为undefined

评论

这回答了你的问题了吗?在计算的vue中使用箭头功能不起作用

#1 楼

这两个示例都使用箭头函数() => { },该函数将this绑定到与Vue实例不同的上下文。

根据文档:


不要在实例属性或回调上使用箭头函数(例如vm.$watch('a', newVal => this.myMethod()))。由于箭头函数绑定到父上下文,因此this将不是您期望的Vue实例,而this.myMethod将是未定义的。


为了正确引用this在Vue实例中,请使用常规函数:

mounted: function () {
  console.log(this);
}


或者,您也可以将ECMAScript 5速记用于函数: br />

评论


谢谢!它是如此的明显,同时又非常有用。感觉仅凭投票还不够!

–马塞洛·盖亚(Marcelo Gaia)
18-10-4在0:06

您知道为什么我必须使用反函数(从函数切换到箭头函数)才能在then()回调中使用它吗? github.com/Inndy/vue-clipboard2#sample-2

–尼克·马纳林(Nicke Manarin)
4月26日4:45

@NickeManarin作为回调传递给您的函数,然后具有它自己的this,因此,要使用父函数的上下文来引用此引用,可以使用箭头函数。看到这个帖子:stackoverflow.com/questions/20279484/…

–感谢
4月26日下午16:12

#2 楼

您正在使用箭头功能。

Vue文档中明确指出不要在属性或回调上使用箭头函数。

与常规函数不同,箭头函数不会绑定this。相反,this是按词法绑定的(即,this保留了其原始上下文的含义)。

var instance = new  Vue({
    el:'#instance',
  data:{
    valueOfThis:null
  },
  created: ()=>{
    console.log(this)
  }
});


这会将以下对象记录在控制台中:

Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}

...如果使用常规函数(在Vue实例上应该使用常规函数)

var instance = new  Vue({
    el:'#instance',
  data:{
    valueOfThis:null
  },
  created: function(){
    console.log(this)
  }
});


记录以下内容控制台中的对象:

hn {_uid: 0, _isVue: true, $options: {…}, _renderProxy: hn, _self: hn, …}