在#app 中,应该是parentObject,而不是parentValue。
在 child 中,您有两个 inpyt,但您必须有一个根元素。在下面的示例中,我为组件创建了一个 <div> 根元素。
要更新父级,请发出事件。这种方法不会修改父级在子级中的属性,因此不会破坏单向数据流。
Vue.component('child', {
template: '#child',
//The child has a prop named 'value'. v-model will automatically bind to this prop
props: ['value']
});
new Vue({
el: '#app',
data: {
parentObject: {value1: "1st Value", value2: "2nd value"}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
<p>Parent value: {{parentObject}}</p>
<child v-model="parentObject"></child>
</div>
<template id="child">
<div>
<input type="text" v-bind:value="value.value1" v-on:input="$emit('input', {value1: $event.target.value, value2: value.value2})">
<input type="text" v-bind:value="value.value2" v-on:input="$emit('input', {value1: value.value1, value2: $event.target.value})">
</div>
</template>
关于<input>s:您可以将每个绑定到父value 的属性。然后,在编辑时,发出一个仅修改该属性 (v-on:input="$emit('input', {value1: $event.target.value, value2: value.value2})) 并保留另一个值的事件。父级随之更新。
如果属性比较多,可以在第二个input中替换,例如:
$emit('input', {value1: value.value1, value2: $event.target.value})
有
$emit('input', Object.assign({}, value, {value2: $event.target.value}))
使用方法而不是直接从模板发出
我保留了之前的演示,因为它更直接且更易于理解(对原始代码的更改更少),但更紧凑的方法是使用方法(例如updateValue)并在模板中重用它:
Vue.component('child', {
template: '#child',
//The child has a prop named 'value'. v-model will automatically bind to this prop
props: ['value'],
methods: {
updateValue: function(propertyName, propertyValue) {
this.$emit('input', Object.assign({}, this.value, {[propertyName]: propertyValue}))
}
}
});
new Vue({
el: '#app',
data: {
parentObject: {value1: "1st Value", value2: "2nd value"}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
<p>Parent value: {{parentObject}}</p>
<child v-model="parentObject"></child>
</div>
<template id="child">
<div>
<input type="text" v-bind:value="value.value1" v-on:input="updateValue('value1', $event.target.value)">
<input type="text" v-bind:value="value.value2" v-on:input="updateValue('value2', $event.target.value)">
</div>
</template>
如您所见,上面的演示已经使用了Object.assign(),这意味着它将处理无限数量的属性。