在Vue中,双向绑定是一个核心概念,它允许数据在视图(View)和组件的状态(或数据模型)之间自动同步。这种机制主要通过Vue的v-model
指令来实现,但v-model
实际上是一个语法糖,它背后依赖于.sync
修饰符(在Vue 2.3.0+中引入,用于自定义组件的双向绑定,但在Vue 3中被移除,因为推荐使用v-model
的自定义模型绑定方式)或者更基础的v-bind
(用于绑定数据到子组件的props)和v-on
(或@
,用于监听子组件的事件)来实现。
使用v-model
实现双向绑定
对于Vue的内置组件(如<input>
, <select>
, <textarea>
等),v-model
提供了非常方便的双向绑定功能。例如:
<template><div><input v-model="message" placeholder="edit me"><p>Message is: {{ message }}</p></div>
</template><script>
export default {data() {return {message: ''}}
}
</script>
在这个例子中,message
数据属性被绑定到<input>
元素的value
属性上,并且当<input>
的值发生变化时,message
也会自动更新,这就是双向绑定的效果。
自定义组件的双向绑定
对于自定义组件,Vue 2.2.0+允许你使用.sync
修饰符来实现类似v-model
的双向绑定效果,但Vue 3推荐使用自定义v-model
的方式。
Vue 2中使用.sync
修饰符
Vue 2.3.0+引入了.sync
修饰符,它可以简化子组件更新父组件传入的prop的流程。但请注意,.sync
并不是真正的双向绑定,它只是语法糖,用于$emit
一个update:myPropName
事件。
<!-- 子组件 -->
<template><div><button @click="$emit('update:title', newTitle)">Change title</button></div>
</template><script>
export default {props: ['title'],data() {return {newTitle: 'New title'}}
}
</script><!-- 父组件 -->
<template><div><child-component :title.sync="parentTitle"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue'export default {components: {ChildComponent},data() {return {parentTitle: 'Old title'}}
}
</script>
Vue 3中的自定义v-model
在Vue 3中,.sync
修饰符被移除了,推荐使用自定义v-model
的方式来实现双向绑定。你可以通过指定modelValue
作为prop名,并监听update:modelValue
事件来实现。
<!-- 子组件 -->
<template><div><button @click="emitTitleUpdate">Change title</button></div>
</template><script>
export default {props: {modelValue: String},emits: ['update:modelValue'],methods: {emitTitleUpdate() {this.$emit('update:modelValue', 'New title');}}
}
</script><!-- 父组件 -->
<template><div><child-component v-model="parentTitle"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue'export default {components: {ChildComponent},data() {return {parentTitle: 'Old title'}}
}
</script>
在这个例子中,v-model
在父组件中被用作modelValue
的简写,并且监听update:modelValue
事件来更新parentTitle
。这是Vue 3中推荐的自定义组件双向绑定的方式。