У меня есть форма, где мне нужно обновить несколько других полей формы при обновлении другого поля. Например, у меня есть имя контакта, и в зависимости от имени контакта мне нужно обновить значения адреса электронной почты и телефона.
<template>
<custom-input :value="contact.name" @input="event => contact.name = event.target.value" />
<custom-input :value="contact.phone" @input="event => contact.phone = event.target.value" />
<custom-input :value="contact.email" @input="event => contact.email = event.target.value" />
</template>
<script>
...
props: {
contact: {
type: Object,
required: true
}
},
watch:
"contact.name": function(value) {
if (this.contact.name === "john") {
this.contact.email = "john@email.com"
this.contact.phone = "1111111111"
} else if (this.contact.name === "ed") {
this.contact.email = "ed@email.com"
this.contact.phone = "2222222222"
}
}
}
...
</script>
Я понимаю, что Vue это не нравится, потому что оно отделяет DOM от модели данных. Моей первой мыслью было использовать $refs
, но это только для чтения. Какой правильный способ сделать это?
Еще одна мысль, которая у меня была, заключалась в том, чтобы установить значения name
и phone
для вычисляемых свойств. Проблема в том, что он не отслеживается на форме в родительском компоненте.
Это также может быть связано с моим неправильным пониманием "двустороннего" связывания. Я всегда считал, что форма - это один способ, а данные в скрипте компонента - другой, а это не так. Итак, как же иначе?
Последняя мысль, которая у меня возникла, заключается в том, что мне, возможно, придется вместо этого генерировать событие?
<template>
<custom-input :value="contact.name" @input="event => contact.name = event.target.value" />
<custom-input ref="phone" :value="contact.phone" @input="event => contact.phone = event.target.value" />
<custom-input ref="email" :value="contact.email" @input="event => contact.email = event.target.value" />
</template>
<script>
...
props: {
contact: {
type: Object,
required: true
}
},
watch:
"contact.name": function(value) {
if (this.contact.name === "john") {
this.$refs.email.$emit("input", "john@email.com")
this.$refs.phone.$emit("input", "111111111111")
} else if (this.contact.name === "ed") {
this.$refs.email.$emit("input", "ed@email.com")
this.$refs.phone.$emit("input", "222222222222")
}
}
}
Похоже, это тоже не работает. Облом.
Редактировать
Исправлены синтаксические ошибки
Редактировать 2
Показано, что input
действительно было отдельный дочерний компонент