Pristup svojstvima u okviru same Vue instance
Unutar Vue.js instance ključna reč „this“ ukazuje na instancu vue.js objekta. Stoga se za pristup svojstvima instance koristi rezervisana reč „this“, na koju se nadovezuje naziv željenog svojstva:
|
|
this.nazivSvojstvaVueInstance |
Treba napomenuti da su odredjena svojstva vue instance specifična, jer se kod njih odvija dodatna „magija u pozadini“. Svojstva data, methods, computed i watch se ponašaju kao „proxy za vue instancu“, pa sva svojstva unutar njih se direktno prosledjuju vue instanci. Zbog toga sva child svojstva ovih navedenih svojstava se predstavljaju kao da su direktna svojstva Vue instance.
Primer
Zahvaljujući ovoj „magiji“, kod tergetiranja child svojstava unutar tih specifinih svojstava, pristupamo im kao da su „glavna“ svojstva. Tako da ne moramo da koristimo „this.data.nekoSvojstvo“, već možemo da koristimo samo „this.nekoSvojstvo“.
|
|
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' }, methods: { ispisiPoruku : function () { console.log (this.message); } } }) |
U ovome primeru umesto da koristimo this.data.message izraz, mi koristimo this.message kao sasvim legitiman način.
Problematični slučajevi pri korišćenju „this“ (za: data, methods, computed i watch)
a) Arrow funkcija
Child svojstva u okviru ovih „specijalni“ svojstava (data, methods, computed i watch), upravo zbog „magije“ u pozadini ne bi trebalo da koriste arrow funkciju jer ona koristi leksički „this“ tj. koristi „this“ od roditeljskog okruženja pa bi u tom slučaju vraćao „undefined“. Više o arrow funkciji možete pročitati u članku „Arrow funkcija“
b) Closure
Ukoliko clousure funkciju poziva spoljna funkcija, onda se pri odredjivanju vrednosti ključne reči „this“ koristi “podrazumevano pravilo” (pročitaj više o ovome u članku „Značenje operatora “this” u JavaScript-u“). Iz pomenutog razloga ključna reč „this“ u okviru closure ukazuje na globalni objekat.
Primer
U ovome primeru this.message ne vraća očekivanu vrednost već „undefined“ jer globalni objekat nema svojstvo „message“
|
|
var app = new Vue({ el: "#app", data: { message: 'Poruka poslata iz closure!' }, methods: { ispisiPoruku : function () { function nekaClosure(){ return this.message; }; var a = nekaClosure() console.log(a); // Vraća undefined } } }) |
Za rešenje ovog problema možemo koristi poznatu tehniku
var self = this;, gde u okviru nove variable van closure funkcije sačuvamo vrednost this (closure ima uvek pristup ovoj promenjivoj). Više o ovome mehanizmu pročitajte u sekciji „Mehanizam self=this”
See the Pen Closure unutar Vue.js by Web programiranje (@chos) on CodePen.
Read more