Poznajemy watchers, kolejną ważną rzecz w Vue i ogólnie we frameworkach frontendowych. Przypominamy sobie, co już wiemy. Do dzieła.
Oto nasza apka od strony markupu:
<div id="app">
<p>Random number: {{Math.random()}}</p>
<p>Counter: {{counter}}</p>
<p>Fullname: {{fullname}}</p>
<button v-on:click="increment">+ 1</button>
<button @click="incrementDelayed">+ 1 delayed</button>
</div>
Wyjaśnienie:
- Div #app to root element, do którego mountujemy apkę
- W nawiasach wąsatych Math.random wywołuje inline funkcję JS (przy każdym re-renderze będzie wywoływana)
- Obok Counter mamy zmienną z data, którą interpolujemy, zmiana tej zmiennej będzie wywoływać re-render
- Poniżej, choć jeszcze tego nie widać, mamy computed property fullna,e, wyliczane na podstawie zależności, jaką jest name w data
- Pod spodem mamy dwa różne guziki, do których na kliknięcie są przypisane dwie różne metody z methods
Ok, teraz jak to wygląda w kodzie:
const app = Vue.createApp({
data() {
return {
counter: 0,
name: "John"
};
},
methods: {
increment(){
this.counter++;
},
incrementDelayed(){
let that = this;
setTimeout(() => {
that.counter++;
that.name = "Jane"
}, 3000);
}
},
computed: {
fullname(){
console.log("I run");
return this.name + " Doe";
},
},
});
app.mount('#app');
Ok, czyli mamy:
- data, czyli zmienne, do których możemy się dostać przez „this”
- methods, czyli metody – można bindować pod eventy albo wywoływać, metody nieeventowe będą zawsze się odpalać po każdym re-renderze, wytłumaczyliśmy i pokazaliśmy co to znaczy poprzednio
- computed properties, czyli używamy ich jako properties (bez wywołania), ale są to metody, które odpalają się i obliczają property tylko wtedy, gdy jakaś zależność się zmieni
Ok, dodamy watchers i obserwujemy co się zmieni, dlatego alert:
const app = Vue.createApp({
//(...)
watch: {
name(value){
alert(value);
},
counter(value){
alert(value, oldValue);
}
}
});
app.mount('#app');
Kilka uwag:
- Metody można podpinać do eventów albo używać ich w apce
- Nie licząc metod wymagających eventu do triggera, każda metoda odpali się przy każdym re-renderze
- Re-render jest wymuszony gdy jakaś zmienna z data jest wyświetlana i ulegnie zmianie
- Computed properties nie są w ogóle odpalane, jeżeli computed property nie jest wyświetlane (zmiana nie ma znaczenia)
- Computed properties (wyświetlane) odpalają się na mount aplikacji, obliczają property i ignorują kolejne re-rendery, chyba że zależność ich property ulegnie zmianie
- Watchers mogą być używane jako computed properties, ale wcale nie muszą
- Watchers niczego nie zwracają (choć mogą ustawiać swoje property albo wszystko inne, pod this mają)
- Watchers przyjmują nową wartość