【发布时间】:2017-06-06 15:51:55
【问题描述】:
我了解 Vue 2.3 中返回的 .sync 修饰符,并将其用于实现“多项选择”问题和答案的简单子组件。父组件这样调用子组件:
<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)
}
}
}
这一切都很好,除了如果 parent 然后由于应用程序中发生的其他事情而更改 userChoice 的值,孩子不会更新单选按钮.我必须在孩子中包含这个watch:
watch: {
answer () {
this.option = this.answer
}
}
但这感觉有点多余,我担心发出事件来更新父母的数据实际上会导致孩子的“观看”事件也被触发。在这种情况下,除了浪费几个周期外,它不会产生任何影响,但如果它正在记录或计数任何东西,那将是一个误报......
也许这是真正的 2 向绑定(即动态父 → 子,以及子 → 父)的正确解决方案。我是否错过了有关如何连接两侧的“输入”和“输出”数据的内容?
如果您想知道,想要更改“userChoice”的家长最常见的情况是响应“清除答案”按钮,该按钮会将userChoice 设置回空字符串。这应该具有“取消设置”所有单选按钮的效果。
【问题讨论】:
标签: vue.js vuejs2 2-way-object-databinding