一个组件上只能定义一个v-model,若是其余prop也要实现双向绑定的效果该怎么办呢? 简单的方法是子组件向父组件发送一个事件,父组件监听该事件,而后更新prop。具体以下:vue
// info.vue组件定义了一个value 属性, 和一个valueChanged事件 <template> <div> <input @input="onInput" :value="value"/> </div> </template> <script> export default { props: { value: { type: String } }, methods: { onInput(e) { this.$emit("valueChanged", e.target.value) } } } </script>
父组件index.vuethis
<template> <info :value="myValue" @valueChanged="e => myValue = e"></info> </template> <script> inport info from './info.vue'; export default { components: { info, }, data() { return { myValue: 1234, } }, } </script>
上述写法太麻烦了,经过.sync能够简化上面代码,只须要修两个地方:双向绑定
这样父组件就不用再手动绑定@update:value事件了。code
// info.vue组件 ... methods: { onInput(e) { this.$emit("update:value", e.target.value) } }
// index.vue组件 <info :value.sync="myValue"></info>
若是一个组件的多个prop都要实现双向绑定,根据上面学到的知识,只须要每一个prop加sync修饰符component
<info :a.sync="value1" :b.sync="value2" :c.sync="value2" :d.sync="value2"></info>
这样写太麻烦,vue提供了一种更简便的方法, v-bind.sync = "对象"对象
<info v-bind.sync="obj"></info> ... <script> .. data() { obj: {a: '', b: '', c: '', d: ''} } .. </script>
带有.sync修饰符的v-bind不能喝表达式一块儿使用(例如 v-bind:title.sync = "doc.title + '!'"是无效的)。取而代之的是,你只能你想要绑定的属性名。事件
一个组件须要提供多个双向绑定的属性时使用,只能选用一个属性来提供 v-model 功能,但若是有其余属性也要提供双向绑定,就须要.syncip