Saya mulai bermain dengan vuejs (2.0). Saya membangun halaman sederhana dengan satu komponen di dalamnya. Halaman memiliki satu instance Vue dengan data. Pada halaman itu saya mendaftar dan menambahkan komponen ke html. Komponen memiliki satu input[type=text]
. Saya ingin nilai itu mencerminkan orangtua (contoh Vue utama).
Bagaimana cara saya memperbarui data induk komponen dengan benar? Melewati prop terikat dari orang tua tidak baik dan melemparkan beberapa peringatan ke konsol. Mereka memiliki sesuatu dalam dokumen mereka tetapi tidak berfungsi.
javascript
vue.js
vue-component
Gal Ziv
sumber
sumber
Jawaban:
Pengikatan dua arah telah ditinggalkan dalam Vue 2.0 demi penggunaan arsitektur yang lebih digerakkan oleh peristiwa. Secara umum, seorang anak tidak boleh mengubah alat peraga. Sebaliknya, itu harus
$emit
acara dan biarkan orang tua menanggapi peristiwa itu.Dalam kasus spesifik Anda, Anda dapat menggunakan komponen khusus dengan
v-model
. Ini adalah sintaks khusus yang memungkinkan untuk sesuatu yang dekat dengan pengikatan dua arah, tetapi sebenarnya adalah singkatan untuk arsitektur berbasis peristiwa yang dijelaskan di atas. Anda dapat membacanya di sini -> https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events .Berikut ini contoh sederhana:
Dokumen menyatakan itu
setara dengan
Karena itulah properti pada anak perlu dinamai nilai, dan mengapa anak perlu $ memancarkan suatu peristiwa bernama
input
.sumber
undefined
sampai perubahan pertama. Lihat biola ini tempat saya berkomentarprops: ['value']
. Perhatikan bagaimana nilai awalundefined
, alih-alihhello
: jsfiddle.net/asemahle/8Lrkfxj6 . Setelah perubahan pertama, Vue secara dinamis menambahkan prop nilai ke komponen, sehingga berfungsi.Dari dokumentasi :
Cara lulus alat peraga
Berikut ini adalah kode untuk meneruskan alat peraga ke elemen anak:
Bagaimana cara memancarkan acara
HTML:
JS:
sumber
Dalam komponen anak:
Dalam komponen induk:
sumber
Komponen Anak
Gunakan
this.$emit('event_name')
untuk mengirim acara ke komponen induk.Komponen Induk
Untuk mendengarkan peristiwa itu di komponen induk, kita lakukan
v-on:event_name
dan metode (ex. handleChange
) yang ingin kita jalankan pada peristiwa itu terjadiSelesai :)
sumber
Saya setuju dengan acara memancarkan dan jawaban model-v untuk yang di atas. Namun, saya pikir saya akan memposting apa yang saya temukan tentang komponen dengan beberapa elemen bentuk yang ingin dipancarkan kembali ke induknya karena ini sepertinya salah satu artikel pertama yang dikembalikan oleh google.
Saya tahu pertanyaannya menentukan input tunggal, tetapi ini tampaknya paling cocok dan mungkin menghemat waktu orang dengan komponen vue yang serupa. Juga, belum ada yang menyebutkan
.sync
modifikator.Sejauh yang saya tahu,
v-model
solusinya hanya cocok untuk satu input yang kembali ke orangtua mereka. Saya mengambil sedikit waktu untuk mencarinya tetapi dokumentasi Vue (2.3.0) menunjukkan bagaimana cara menyinkronkan beberapa alat peraga yang dikirim ke komponen kembali ke induknya (tentu saja melalui emit).Itu tepat disebut
.sync
pengubah.Inilah yang dikatakan dalam dokumentasi :
Anda juga dapat menyinkronkan banyak sekaligus dengan mengirim melalui objek. Lihat dokumentasi di sini
sumber
Cara yang lebih sederhana adalah penggunaan
this.$emit
Father.vue
Anak
Contoh lengkap saya: https://codesandbox.io/s/update-parent-property-ufj4b
sumber
Dimungkinkan juga untuk melewatkan alat peraga sebagai Obyek atau Array. Dalam hal ini data akan diikat dua arah:
(Ini dicatat di akhir topik: https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow )
sumber
Cara yang benar adalah untuk
$emit()
suatu peristiwa dalam komponen anak yang didengar oleh instance Vue utama .sumber
1) Child Compnent: Anda dapat menggunakan seperti ini di komponen anak, tulis seperti ini: this.formValue adalah mengirim beberapa data ke komponen induk
2) Parrent Compnenet: dan di parrent tag komponen menerima variabel kirim seperti ini: dan ini adalah kode untuk menerima bahwa data kompnen anak di tag komponen induk
sumber
Cara lain adalah dengan memberikan referensi penyetel Anda dari induk sebagai penyangga ke komponen anak, mirip dengan cara mereka melakukannya di Bereaksi. Katakanlah, Anda memiliki sebuah metode
updateValue
pada orang tua untuk memperbarui nilai, Anda bisa instantiate komponen anak seperti:<child :updateValue="updateValue"></child>
. Kemudian pada anak Anda akan memiliki prop sesuai:props: {updateValue: Function}
, dan dalam template memanggil metode ketika input berubah:<input @input="updateValue($event.target.value)">
.sumber
Saya tidak tahu mengapa, tapi saya baru saja berhasil memperbarui data induk dengan menggunakan data sebagai objek,
:set
&computed
Parent.vue
Anak
sumber
contohnya akan memberi tahu Anda cara menyampaikan nilai input kepada orang tua pada tombol kirim.
Pertama, tentukan eventBus sebagai Vue baru.
sumber
Saya pikir ini akan melakukan trik:
@change="$emit(variable)"
sumber