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" />
<input :value="something" @input="something = $event.target.value" />
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)) } } })
<currency-input v-model="price"></currency-input> 所以在组件中使用时,它相当于下面的简写: //上行代码是下行的语法糖 <currency-input :value="price" @input="price = arguments[0]"></currency-input>
<input type="checkbox" v-model="something" />
Oleh kerana model v hanya digunakan pada elemen input, situasi ini mudah untuk diselesaikan:
<input type="checkbox" :checked="value" @change="change(value, $event)"
<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); } })
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!