Допустим, у меня есть форма, разделенная на две части, каждая из которых связана с родительской формой через реквизит. Как избежать мутации реквизита, переданного из родительской формы?
ParentForm.vue
<template>
<div>
<AddressForm :form-data = "formData.address" />
<OtherForm :form-data = "formData.other" />
</div>
</template>
<script>
export default {
data() {
return {
formData: {
address: {
address_no: "",
country: "",
},
other: {
remarks: "",
},
},
};
},
};
</script>
AddressForm.vue
<template>
<div>
<input v-model = "formData.address_no" />
<input v-model = "formData.country" />
</div>
</template>
<script>
export default {
name: "AddressForm",
props: { formData: { type: Object, required: true } },
};
</script>
ДругоеForm.vue
<template>
<div>
<textarea v-model = "formData.remarks" />
</div>
</template>
<script>
export default {
name: "OtherForm",
props: { formData: { type: Object, required: true } },
};
</script>
Изменение значения полей ввода в AddressForm.vue
или OtherForm.vue
вызовет предупреждение о мутации реквизита. Я хотел знать, как мне общаться вверх/вниз с формами без изменения реквизита?
Я придумал возможные решения, но я не знаю, какое из них мне выбрать (а также как это реализовать)
formData
реквизит в created()
и свяжите v-model
с локальным клоном formData
вместо реквизита. Затем наблюдайте за клонированным formData
и излучайте каждый раз, когда значение изменяется.Сделайте дочерние формы пользовательскими входными данными, используя v-model
вместо передачи реквизита:
AddressForm.vue
<template>
<div>
<input :value = "value.address_no" @input = "$emit('input',{...value,address_no:$event.target.value)" />
<input :value = "value.country" @input = "$emit('input',{...value,country:$event.target.value)" />
</div>
</template>
<script>
export default {
name: "AddressForm",
props: { value: { type: Object, required: true } },
};
</script>
ДругаяФорма:
<template>
<div>
<textarea :value = "value.remarks" @input = "$emit('input',{...value,remarks:$event.target.value)"/>
</div>
</template>
<script>
export default {
name: "OtherForm",
props: { value: { type: Object, required: true } },
};
</script>
в родительском компоненте:
<AddressForm v-model = "formData.address" />
<OtherForm v-model = "formData.other" />
с удовольствием, добавьте модификатор lazy
в директиву v-model
, например <OtherForm v-model.lazy = "formData.other" />
Вы можете присвоить beforeMount()
эти реквизиты некоторым значениям данных, а затем $эмитировать их обратно.
Очевидно, что v-model
должно относиться к свойствам, определенным в data()
.
Спасибо, а можно пример?
Спасибо, у меня есть еще вопрос - генерация на каждом @input не очень идеальна для меня (я работаю над очень большой формой). Есть ли способ оптимизировать это?