Rumah > Soal Jawab > teks badan
Saya agak baru menggunakan Vue dan sedang menyiapkan projek pertama saya. Saya cuba membuat borang dengan berbilang komponen anak dan cucu. Saya telah menghadapi masalah di mana saya perlu menjana berbilang salinan borang. Oleh itu, saya mengalihkan beberapa atribut data ke atas 1 tahap. Pada masa ini, borang tersebut adalah ApplicationPage.Vue > Masalah saya ialah saya perlu mengeluarkan perubahan daripada PersonalInformation kepada ApplicationPage melalui TheApplication . Saya mengalami kesukaran untuk memikirkan bagaimana untuk menangani situasi ini. Saya telah mencari penyelesaian untuk Vue2 tetapi tidak menemui penyelesaian untuk Vue3.
ApplicationPage.vue
template <TheApplication :petOptions="petOptions" :stateOptions='stateOptions' v-model="data.primary" applicant="Primary"/> script data() { return { data: { primary: { personalInformation: { first_name: "", middle_name: "", last_name: "", date_of_birth: "", phone: null, email: "", pets: "", driver_license: null, driver_license_state: "", number_of_pets: null, additional_comments: "" }, }, }, } },
TheApplication.Vue
<personal-information :petOptions="petOptions" :stateOptions='stateOptions' :personalInformation="modelValue.personalInformation" @updateField="UpdateField" />
methods: { UpdateField(field, value) { this.$emit('update:modelValue', {...this.modelValue, [field]: value}) },
maklumat peribadi.vue
<base-input :value="personalInformation.first_name" @change="onInput('personalInformation.first_name', $event.target.value)" label="First Name*" type="text" class="" required/>
methods: { onInput(field, value) { console.log(field + " " + value) // this.$emit('updateField', { ...this.personalInformation, [field]: value }) this.$emit('updateField', field, value) }, }
P粉0378809052023-11-04 14:55:06
Bagi sesiapa yang tidak mahu memautkan peristiwa yang dipancarkan, terdapat objek induk pada objek anak yang juga boleh digunakan untuk memancarkan peristiwa. Pastikan anda mendaftar pelancaran dalam induk untuk mengelakkan amaran dalam konsol.
Hubungi terus ibu bapa $emit
di sini.
Child.vue
<input @input="$parent.$emit('custom-event', e.target.value) />
Atau cara penggunaan:
<input @input="handleInput" />
export default { methods: { handleInput(e) { this.$parent.$emit('custom-event', e.target.value) } } }
Oleh kerana ibu bapa yang memberi isyarat kepada nenek moyang, isytiharkan pelepasan di sini. Untuk kaedah ,只需使用
defineEmits()
untuk mengisytiharkan pelepasan. Sila rujuk Dokumentasi.
Parent.vue
<Child /> <!-- No need to listen to the event here -->
export default { emits: ['custom-event'] // Register the emits }
Jika menggunakan <脚本设置>
<script setup> defineEmits(['custom-event']) // Register the emits </script>
Kemudian dengarkan acara dalam komponen datuk dan nenek.
GrandParent.vue
<Parent @custom-event="doSomething()" /> <!-- The event is being listened to in the grandparent component -->
P粉8422150062023-11-04 12:19:54
Begini cara saya melakukannya: kodkodand< /a>
Emits menerima hanya dua parameter, nama yang akan dipancarkan dan nilai yang akan dipancarkan. Jika berbilang nilai dipancarkan, ia mesti dipancarkan sebagai objek tunggal. Dalam penyelesaian saya, komponen Matahari mengeluarkan nama medan dan nilai sebagai objek tunggal
cucu
<input :value="personalInformation.first_name" @input="onInput('first_name', $event.target.value)" ... >
onInput(field, value) { this.$emit("update-field", { field: field, value: value }); },
Objek kanak-kanak menangkap dan menyalin semula, tetapi terlebih dahulu mengambil berat untuk memancarkan dalam format yang diharapkan oleh komponen induk (ia mengambil keseluruhan objek data.primary
kerana itulah yang ditetapkan kepada model v)
Kanak-kanak
<grandchild :personalInformation="modelValue.personalInformation" @updateField="UpdateField" />
UpdateField({ field, value }) { const newVal = this.modelValue; newVal.personalInformation[field] = value; this.$emit("update:modelValue", newVal); }
Kemudian komponen induk akan menerima dan mengemas kini objek v-model data.primary
secara automatik.
atau , saya mesti menyatakan bahawa anda sentiasa boleh menggunakan Pinia, perpustakaan pengurusan negeri rasmi untuk Vue (simpan beberapa keadaan dalam satu komponen dan baca keadaan yang sama daripada mana-mana komponen lain). Sudah tentu terdapat keluk pembelajaran, tetapi ia pasti berbaloi untuk dipelajari dan direka bentuk untuk memudahkan jenis situasi ini.