Poznajemy bardzo ważny koncept przy pracy z frameworkami frontendowymi, zwłaszcza w kontekście reaktywnych formularzy. Do dzieła.
Ok, oto nasz markup:
<div id="app">
<input type="text" :value="name" @input="onInput($event)"/>
<p>Hello {{name}}</p>
</div>
I nasz JS:
const app = Vue.createApp({
data(){
return {
name: "",
};
},
methods: {
onInput(event){
this.name = event.target.value;
}
},
});
app.mount('#app');
Zamiast $event, możemy skorzystać z $refs:
<div id="app">
<input type="text" :value="name" @input="onInput" ref="ipt"/>
<p>Hello {{name}}</p>
</div>
I w JS:
const app = Vue.createApp({
data(){
return {
name: "",
};
},
methods: {
onInput(){
this.name = this.$refs.ipt.value;
}
},
});
app.mount('#app');
Tak czy inaczej mamy tu dwustronny przepływ danych. Dane są pobierane z inputu a zarazem wysyłane z powrotem do niego. Niech to nam się w głowie ułoży, bo zazwyczaj mamy jednostronny przepływ danych w frontendowych frameworkach.
Może poznanie dyrektywy v-model pomoże:
<div id="app">
<input type="text" v-model="name" ref="ipt"/>
<p>Hello {{name}}</p>
</div>
V-model oznacza:
- Weź wartość z inputu i wyślij do name
- Weź wartość z name i zaciągnij jako wartość inputu
Jest to krótsza wersja tego:
<div id="app">
<input type="text" :value="name" @input="onInput($event)"/>
<p>Hello {{name}}</p>
</div>
Musimy to sobie w głowie ułożyć.