VueJS: почему "это" не определено?
Я создаю компонент с Vue.js.
когда я ссылка this
в разделе жизненный цикл крючки (created
, mounted
, updated
, etc.) он оценивает в undefined
:
mounted: () => {
console.log(this); // logs "undefined"
},
то же самое происходит и внутри моих вычисляемых свойств:
computed: {
foo: () => {
return this.bar + 1;
}
}
Я получаю следующую ошибку:
Uncaught TypeError: не удается прочитать свойство "bar" неопределено
почему this
оценка для undefined
в этих случаях?
2 ответов
оба этих примера используют функции стрелочку () => { }
, который обязывает this
к контексту, отличному от экземпляра Vue.
на документация:
Не используйте функции со стрелками для свойства экземпляра или обратного вызова (например,
vm.$watch('a', newVal => this.myMethod())
). Поскольку функции стрелки привязаны к родительскому контексту,this
не будет экземпляром Vue, как вы ожидаете, иthis.myMethod
будет не определено.
для того, чтобы получите правильную ссылку на this
в качестве экземпляра Vue используйте регулярную функцию:
mounted: function () {
console.log(this);
}
кроме того, вы также можете использовать ECMAScript 5 стенография функции:
mounted() {
console.log(this);
}
вы используете функции стрелочку.
на Документация 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, …}