Vue3 组件双向绑定的两种方法

defineProps 和 defineEmits

案例:

# child
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>

<template>
  <input
    :value="props.modelValue"
    @input="emit('update:modelValue', $event.target.value)"
  />
</template>
# father
<Child
  :modelValue="foo"
  @update:modelValue="$event => (foo = $event)"
/>

defineModel

Vue 官网 是这样描述的:从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 因此,以后这个是实现组件双向绑定的首选。

案例:

# child

<template>
  <div>Parent bound v-model is: {
  
  { model }}</div>
  <button @click="update">Increment</button>
</template>

<script setup>
const m
<think>好的,我现在需要帮助用户了解在Vue3中如何实现父子组件双向绑定。根据用户提供的引用内容,特别是引用[4]和[5],Vue3推荐使用defineModel方法或者结合props和emits来实现双向绑定。不过,用户可能需要更详细的步骤和示例代码。 首先,我需要回顾Vue3的相关知识。Vue3中,v-model可以在组件上使用多个,而Vue2中每个组件只能有一个v-model。此外,Vue3提供了更简洁的方式来实现双向绑定,比如使用defineModel宏,这可能需要检查是否在Vue3.3及以上版本中可用。如果用户使用的是较旧的版本,可能需要使用props和emits的传统方法。 然后,根据引用[4],组件通讯是单向数据流,子组件不能直接修改父组件的prop,必须通过事件通知父组件。而引用[5]提到在抽离子模块时,处理输入的双向同步问题,可能需要结合v-model和自定义事件。 接下来,我需要组织步骤。首先介绍使用defineModel的方法,这是Vue3.3+的新特性,可以简化代码。然后,如果用户不能使用这个特性,就展示传统方法,即使用modelValue和update:modelValue的事件。此外,可能还需要提到多个v-model的情况,比如同时绑定多个值。 然后,示例代码部分需要清晰。对于defineModel,父组件使用v-model绑定数据,子组件使用defineModel来接收和修改。对于传统方法,子组件需要声明props和emits,并在输入时触发事件。同时,要注意在父组件中正确绑定v-model。 还要考虑可能的错误,比如用户可能忘记在子组件中声明emits,或者没有正确触发事件。需要确保示例代码的正确性,比如在输入事件中调用emit函数,并传递更新后的值。 另外,用户可能想知道多个v-model如何实现,比如同时绑定两个不同的值,例如用户名和年龄。这时候父组件可以使用v-model:user和v-model:age,子组件则对应使用defineModel(&#39;user&#39;)和defineModel(&#39;age&#39;)。 最后,需要总结两种方法的适用场景,比如推荐使用defineModel因为更简洁,但传统方法兼容性更好。同时,引用相关的参考资料,比如引用[4]和[5],以增强答案的可信度。 现在需要将这些思路整理成结构化的回答,分步骤说明,并附上示例代码。确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不太需要数学公式,不过要注意代码块的使用。同时,生成相关问题,帮助用户进一步学习。</think>### Vue3父子组件双向绑定实现方式 #### 方式1:使用 `defineModel`(Vue3.3+) **步骤说明**: 1. **父组件**通过 `v-model` 传递数据 2. **子组件**使用 `defineModel` 宏直接绑定数据 3. 子组件修改数据会自动同步到父组件 **示例代码**: ```html <!-- 父组件 Parent.vue --> <template> <ChildComponent v-model="message" /> <p>父组件值: {{ message }}</p> </template> <script setup> import { ref } from &#39;vue&#39; import ChildComponent from &#39;./ChildComponent.vue&#39; const message = ref(&#39;默认文本&#39;) </script> <!-- 子组件 ChildComponent.vue --> <template> <input :value="modelValue" @input="updateValue($event.target.value)"> </template> <script setup> const modelValue = defineModel() // 自动绑定父级v-model const updateValue = (val) => { modelValue.value = val // 直接修改即可双向同步 } </script> ``` #### 方式2:传统props/emits方式 **步骤说明**: 1. **父组件**使用 `v-model` 绑定数据 2. **子组件**通过 `props` 接收 `modelValue` 3. **子组件**通过 `emit(&#39;update:modelValue&#39;)` 更新数据 **示例代码**: ```html <!-- 父组件 Parent.vue --> <template> <ChildComponent v-model="count" /> <p>父组件计数: {{ count }}</p> </template> <script setup> import { ref } from &#39;vue&#39; import ChildComponent from &#39;./ChildComponent.vue&#39; const count = ref(0) </script> <!-- 子组件 ChildComponent.vue --> <template> <button @click="addCount">+1</button> </template> <script setup> const props = defineProps([&#39;modelValue&#39;]) const emit = defineEmits([&#39;update:modelValue&#39;]) const addCount = () => { emit(&#39;update:modelValue&#39;, props.modelValue + 1) } </script> ``` #### 方式3:多值双向绑定 ```html <!-- 父组件 --> <UserForm v-model:name="userName" v-model:age="userAge" /> <!-- 子组件 UserForm.vue --> <script setup> const nameModel = defineModel(&#39;name&#39;) const ageModel = defineModel(&#39;age&#39;) </script> ``` ### 技术要点对比 | 方法 | 优点 | 注意点 | |---------------|--------------------------|---------------------------| | `defineModel` | 代码简洁,自动双向绑定 | 需要Vue3.3+版本支持 | | props/emits | 兼容所有Vue3版本 | 需要手动处理emit事件 | [^4][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值