Pola Vue props
turun dan events
naik. Kedengarannya sederhana, tetapi mudah dilupakan saat menulis komponen khusus.
Pada Vue 2.2.0 Anda dapat menggunakan model-v (dengan properti yang dihitung ). Saya telah menemukan kombinasi ini menciptakan antarmuka yang sederhana, bersih, dan konsisten antara komponen:
- Apa pun yang
props
diteruskan ke komponen Anda tetap reaktif (yaitu, itu tidak dikloning juga tidak memerlukan watch
fungsi untuk memperbarui salinan lokal ketika perubahan terdeteksi).
- Perubahan secara otomatis dipancarkan ke induk.
- Dapat digunakan dengan berbagai tingkatan komponen.
Properti yang dikomputasi memungkinkan penyetel dan pengambil ditetapkan secara terpisah. Ini memungkinkan Task
komponen untuk ditulis ulang sebagai berikut:
Vue.component('Task', {
template: '#task-template',
props: ['list'],
model: {
prop: 'list',
event: 'listchange'
},
computed: {
listLocal: {
get: function() {
return this.list
},
set: function(value) {
this.$emit('listchange', value)
}
}
}
})
The Model mendefinisikan properti yang prop
berhubungan dengan v-model
, dan yang acara akan dipancarkan pada perubahan. Anda kemudian dapat memanggil komponen ini dari induknya sebagai berikut:
<Task v-model="parentList"></Task>
The listLocal
properti dihitung menyediakan getter dan setter antarmuka yang sederhana dalam komponen (berpikir itu seperti berada variabel pribadi). Di dalam #task-template
Anda dapat membuat listLocal
dan itu akan tetap reaktif (yaitu, jika parentList
perubahan itu akan memperbarui Task
komponen). Anda juga dapat bermutasi listLocal
dengan memanggil setter (mis., this.listLocal = newList
) Dan itu akan memancarkan perubahan ke induk.
Apa yang hebat tentang pola ini adalah Anda dapat beralih listLocal
ke komponen anak dari Task
(menggunakan v-model
), dan perubahan dari komponen anak akan menyebar ke komponen tingkat atas.
Misalnya, kita memiliki EditTask
komponen terpisah untuk melakukan beberapa jenis modifikasi pada data tugas. Dengan menggunakan v-model
pola properti yang sama dan dikomputasi, kita dapat beralih listLocal
ke komponen (menggunakan v-model
):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Jika EditTask
memancarkan perubahan dengan tepat akan memanggil set()
pada listLocal
dan dengan demikian menyebarkan acara ke tingkat atas. Demikian pula, EditTask
komponen juga bisa memanggil komponen anak lainnya (seperti elemen formulir) menggunakan v-model
.