vue中双向绑定组件传值v-model
时间: 2025-01-13 16:53:37 浏览: 57
### Vue 中 `v-model` 实现组件间的双向数据绑定
#### 使用内置表单输入组件的 `v-model`
在Vue中,`v-model` 是一种语法糖,用于简化模板内的数据双向绑定。对于原生HTML元素(如 `<input>` 或者 `<textarea>`),可以直接使用 `v-model` 来创建双向数据绑定。
```html
<input v-model="message">
<p>Message is: {{ message }}</p>
```
当用户修改输入框的内容时,`message` 的值会自动更新;反之亦然,如果通过JavaScript改变了 `message` 的值,则该变化也会反映到DOM上[^1]。
#### 自定义组件中的 `v-model`
为了使自定义组件支持 `v-model`,需要遵循特定约定:
- 接收名为 `modelValue` 的 prop;
- 发射带有新值作为参数的事件 `update:modelValue`。
例如,在一个简单的开关按钮组件里实现这一功能:
```vue
<template>
<button @click="$emit('update:modelValue', !props.modelValue)">
Toggle me
</button>
</template>
<script setup lang="ts">
import { defineProps } from 'vue';
const props = defineProps({
modelValue: {
type: Boolean,
required: true,
},
});
</script>
```
此代码片段展示了如何接收父级传递下来的布尔类型的属性,并允许点击按钮触发状态反转并通知给父级组件[^2]。
#### 多层嵌套下的 `v-model`
考虑更复杂的场景——在一个对话框内再次包裹另一个具有自己内部逻辑的状态管理器的情况下,仍然可以通过组合多个计算属性来维持良好的用户体验而不破坏原有的交互模式。
下面是一个例子,它展示了一个弹窗组件 (`Dialog`) 如何将其可见性的控制权交给外部使用者的同时保持自身的独立性:
```vue
<!-- Dialog.vue -->
<template>
<el-dialog :visible="computedVisible"></el-dialog>
</template>
<script setup lang="ts">
import { computed, defineProps, defineEmits } from 'vue';
// 定义接受来自父组件的数据项及其默认值
const props = defineProps({
modelValue: {
type: Boolean,
default: false,
}
});
// 创建发射器实例以便于向上传递更改后的值
const emit = defineEmits(['update:modelValue']);
// 计算属性负责同步本地状态与传入prop的变化
const computedVisible = computed({
get() {
return props.modelValue;
},
set(newValue) {
emit('update:modelValue', newValue);
}
});
</script>
```
这段代码说明了即使是在深层次结构里面也可以轻松地利用 `v-model` 进行有效的双向通信[^3]。
阅读全文
相关推荐


















