当我在任何生命周期挂钩(
this
,created
,mounted
等)中引用updated
时,其评估结果为undefined
:mounted: () => {
console.log(this); // logs "undefined"
},
我的计算属性内部也发生了同样的事情:
computed: {
foo: () => {
return this.bar + 1;
}
}
我得到以下错误:
未被捕获的TypeError:无法读取未定义的属性'bar'
为什么在这种情况下
this
评估为undefined
?#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, …}
评论
这回答了你的问题了吗?在计算的vue中使用箭头功能不起作用