1.首先以前我们针对父子组件传参是不是通过defineProps与
defineEmits来实现的,但是这么
比较繁琐,因为他是单向传参,而不是双向的,这里我们要介绍的是vue3.4的v-model来实现双向数据传递。
2、代码示例:
//父组件
<template><Add ref="addForm" v-model="drawerStates.add"></Add>
</template>import Add from './add.vue'
const addForm = ref(null)
const drawerStates = reactive({add: false
})//子组件
//父组件使用 v-model="state" 时,这个 state 值会传递给 modelValue prop
const props = defineProps({modelValue: Boolean//这是 Vue 3 中 v-model 的默认 prop 名称
})
// 定义组件可以触发的事件
// 当子组件触发这个事件时,父组件的 v-model 值会更新
const emit = defineEmits(['update:modelValue'])
// 创建一个计算属性 drawerOpen,用于双向绑定
const drawerOpen = computed({// 从父组件获取当前值get() {return props.modelValue},// 通知父组件值的变化set(value) {emit('update:modelValue', value)}
})
//这样在子组件内部可以像使用普通 ref 一样使用 drawerOpen.value
3、工作流程:
-
当父组件
drawerStates.add
变化 → 自动更新props.modelValue
-
当子组件修改
drawerOpen.value
→ 触发update:modelValue
→ 父组件drawerStates.add
更新
4、为什么这么写?
-
实现真正的双向绑定,而不仅仅是单向数据流
-
保持组件状态与父组件同步
-
符合 Vue 3 的组件通信规范
-
使组件可以像原生表单元素一样工作