Rumah > Artikel > hujung hadapan web > Adakah data vue mengalir sehala?
adalah sehala. Walaupun Vue mempunyai "model v" yang mengikat dua hala, pemindahan data antara komponen induk dan anak Vue masih mengikut aliran data sehala Komponen induk boleh menghantar prop kepada komponen anak, tetapi komponen anak tidak boleh mengubah suai prop yang diluluskan oleh komponen induk , komponen anak hanya boleh memberitahu komponen induk tentang perubahan data melalui peristiwa.
Persekitaran pengendalian tutorial ini: sistem windows7, versi vue3, komputer DELL G3.
Vue ialah aliran data sehala dan arah aliran data adalah dari atas ke bawah, daripada komponen induk kepada komponen anak.
Jangan keliru dengan pengikatan data dua hala Vue;
Pemindahan data antara komponen induk dan anak Vue mengikut aliran data sehala Komponen induk boleh menghantar prop kepada komponen anak, tetapi komponen anak tidak boleh mengubah suai prop yang diluluskan oleh komponen induk komponen induk data berubah melalui peristiwa.1. Aliran data sehala:
Semua prop membentuk ikatan sehala ke bawah antara prop ibu bapa dan anak mereka: kemas kini prop induk akan Mengalir turun ke dalam komponen kanak-kanak, tetapi bukan sebaliknya. Ini akan menghalang komponen anak daripada menukar keadaan komponen induk secara tidak sengaja, menjadikan aliran data aplikasi anda sukar difahami. Selain itu, setiap kali komponen induk bertukar, semua prop dalam komponen anak akan dimuat semula kepada nilai terkini. Ini bermakna anda tidak boleh menukar prop dalam komponen kanak-kanak. Jika anda melakukan ini, ia juga akan mengubah keadaan komponen induk.2. Prop dihantar masuk melalui rujukan:
Perhatikan bahawa dalam objek dan tatasusunan JavaScript dihantar melalui rujukan, jadi untuk tatasusunan atau jenis objek Untuk prop, menukar objek atau tatasusunan itu sendiri dalam komponen anak akan mempengaruhi keadaan komponen induk.<input v-model="something" /> <input v-bind:value="something" v-on:input="something = $event.target.value" />Yang pertama baris kod sebenarnya hanyalah gula sintaktik untuk baris kedua. Kemudian baris kedua kod boleh dipendekkan seperti ini:
<input :value="something" @input="something = $event.target.value" />Untuk memahami baris kod ini, mula-mula anda perlu tahu bahawa elemen input itu sendiri mempunyai acara oninput Ini adalah tambahan baharu kepada HTML5 , serupa dengan onchange Apabila kandungan kotak input berubah, oninput akan dicetuskan dan nilai terkini akan dihantar kepada sesuatu melalui $event.
Jika kita perhatikan dengan teliti dua baris kod gula sintaksis dan sintaks asal, kita boleh membuat kesimpulan: Apabila menambah atribut model-v pada elemen input, nilai akan digunakan sebagai atribut elemen secara lalai, dan kemudian Peristiwa 'input' digunakan sebagai peristiwa pencetus untuk pemindahan nilai masa nyata
<currency-input v-model="price"></currency-input> Vue.component('currency-input', { template: '\ <span>\ $\ <input\ ref="input"\ v-bind:value="value"\ v-on:input="updateValue($event.target.value)"\ >\ </span>\ ', props: ['value'], // 为什么这里要用 value 属性,value在哪里定义的? methods: { // 不是直接更新值,而是使用此方法来对输入值进行格式化和位数限制 updateValue: function (value) { var formattedValue = value // 删除两侧的空格符 .trim() // 保留 2 位小数 .slice( 0, value.indexOf('.') === -1 ? value.length : value.indexOf('.') + 3 ) // 如果值尚不合规,则手动覆盖为合规的值 if (formattedValue !== value) { this.$refs.input.value = formattedValue } // 通过 input 事件带出数值 // <!--为什么这里把 'input' 作为触发事件的事件名?`input` 在哪定义的?--> this.$emit('input', Number(formattedValue)) } } })Jika anda tahu jawapan kepada dua soalan ini, tahniah kerana benar-benar menguasai v-model Jika anda tidak faham, anda boleh lihat kod ini:
<currency-input v-model="price"></currency-input> 所以在组件中使用时,它相当于下面的简写: //上行代码是下行的语法糖 <currency-input :value="price" @input="price = arguments[0]"></currency-input>Jadi, apabila menambahkan atribut model-v pada komponen, nilai tersebut akan digunakan sebagai atribut komponen secara lalai, dan nilai 'input' akan digunakan sebagai nama acara apabila mengikat acara pada komponen. Ini amat berguna apabila menulis komponen.
<input type="checkbox" v-model="something" />v-model memberikan kita atribut nilai dan peristiwa oninput Walau bagaimanapun, apa yang kita perlukan bukanlah atribut nilai, tetapi atribut yang diperiksa, dan ia tidak akan dicetuskan apabila anda mengklik butang radio ini. . acara onput, ia hanya akan mencetuskan acara onchange.
Oleh kerana model v hanya digunakan pada elemen input, situasi ini mudah untuk diselesaikan:
<input type="checkbox" :checked="value" @change="change(value, $event)"Apabila model v digunakan pada komponen:
<checkbox v-model="value"></checkbox> Vue.component('checkbox', { tempalte: '<input type="checkbox" @change="change" :checked="currentValue"/>' props: ['value'], data: function () { return { //这里为什么要定义一个局部变量,并用 prop 的值初始化它。 currentValue: this.value }; }, methods: { change: function ($event) { this.currentValue = $event.target.checked; this.$emit('input', this.currentValue); } })Dalam Vue versi 2.2, anda boleh menyesuaikan prop/acara melalui pilihan model apabila menentukan komponen.
Jadi, apabila anda ingin mengubah suai prop dalam komponen anak, gunakan komponen anak sebagai komponen induk, jadi terdapat
[Cadangan berkaitan: tutorial video vuejs, pembangunan bahagian hadapan web]
Atas ialah kandungan terperinci Adakah data vue mengalir sehala?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!