Я понимаю модификатор .sync
, возвращаемый в Vue 2.3, и использую его для простого дочернего компонента, который реализует вопрос и ответ с «множественным выбором». Родительский компонент вызывает дочерний элемент следующим образом:
<question
:stem="What is your favourite colour?"
:options="['Blue', 'No, wait, aaaaargh!']
:answer.sync="userChoice"
>
У родительского элемента есть строковый элемент данных userChoice
для хранения результата дочернего компонента. Ребенок представляет вопрос и переключатели для вариантов. Основные части ребенка выглядят следующим образом (я использую Quasar, отсюда q-radio
):
<template>
<div>
<h5>{{stem}}</h5>
<div class="option" v-for="opt in options">
<label >
<q-radio v-model="option" :val="opt.val" @input="handleInput"></q-radio>
{{opt.text}}
</label>
</div>
</div>
</template>
export default {
props: {
stem: String,
options: Array,
answer: String
},
data: () => ({
option: null
}),
methods: {
handleInput () {
this.$emit('update:answer', this.option)
}
}
}
Все это работает нормально, за исключением того факта, что если родительский затем изменяет значение userChoice
из-за чего-то еще, происходящего в приложении, дочерний элемент не обновляет переключатели. Пришлось включить этот watch
в дочерний элемент:
watch: {
answer () {
this.option = this.answer
}
}
Но это кажется немного избыточным, и я беспокоился, что генерация события для обновления родительских данных на самом деле приведет к срабатыванию дочернего события watch. В этом случае это не имело бы никакого эффекта, кроме потери нескольких циклов, но если бы он регистрировал или считал что-либо, это было бы ложным срабатыванием ...
Возможно, это правильное решение для истинного двустороннего связывания (т.е. динамического родительского → дочернего, а также дочернего → родительского). Я что-то пропустил о том, как соединить входящие и исходящие данные с обеих сторон?
Если вам интересно, наиболее распространенным случаем, когда родитель хочет изменить userChoice, будет ответ на кнопку «Очистить ответы», которая вернет userChoice
обратно в пустую строку. Это должно привести к отключению всех переключателей.