App.vue
<template>
<div>
{{ form }}
<son v-model="form"></son>
</div>
</template>
<script setup>
import son from './son.vue';
let form = ref({
name: '123',
age: '',
});
</script>
son.vue
<template>
<div>
<input type="text" v-model="form.name" />
</div>
</template>
<script setup>
let props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);
let form = computed({
get() {
return new Proxy(props.modelValue, {
set(target, key, value) {
emit('update:modelValue', { ...target, [key]: value });
return true;
},
});
},
set(val) {
emit('update:modelValue', { ...props.modelValue, name: val });
},
});
</script>
- 子组件接收一个
modelValue的 prop,并通过v-model机制实现了对父组件数据的双向绑定。 - 在模板中,使用了
<input>元素,其值绑定到了form.name。 - 使用
<script setup>语法,通过let props = defineProps(['modelValue']);定义了props对象,接收modelValue的值。 - 使用
const emit = defineEmits(['update:modelValue']);定义了emit函数,用于触发update:modelValue事件。 - 使用
let form = computed({ ... });定义了form变量,通过Proxy对象包装props.modelValue,以监听对其属性的修改,并在修改时通过emit触发update:modelValue事件,从而实现父子组件之间的双向绑定。