Vue3的双向数据绑定

如果你有多个 ref 类型的数据需要在父子组件之间实现双向绑定,可以使用 v-model 来进行多个数据的双向绑定。在 Vue 3 中,v-model 默认是针对 modelValue 的,但你可以通过指定自定义的属性名来实现多个双向绑定。

多个 v-model 双向绑定的实现

在 Vue 3 中,你可以使用多个 v-model 绑定到不同的属性,利用 update:<propName> 事件来同步数据。下面是如何在父子组件之间实现多个 v-model 的双向绑定。

示例代码

父组件:多个 v-model 的双向绑定
vue 复制代码
<template>
  <div>
    <!-- 使用 v-model 实现多个双向绑定 -->
    <p>父组件值 1:{{ parentValue1 }}</p>
    <p>父组件值 2:{{ parentValue2 }}</p>

    <ChildComponent
      v-model:value1="parentValue1"
      v-model:value2="parentValue2"
    />
    
    <button @click="incrementParentValues">父组件增加值</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 父组件中的多个值
const parentValue1 = ref(0);
const parentValue2 = ref(0);

// 父组件的方法:更新多个值
function incrementParentValues() {
  parentValue1.value++;
  parentValue2.value++;
}
</script>
子组件:通过 v-model 和事件通信实现多个双向绑定
vue 复制代码
<template>
  <div>
    <!-- 子组件中显示父组件传递的多个值,并通过按钮修改它们 -->
    <p>子组件接收的值 1:{{ value1 }}</p>
    <p>子组件接收的值 2:{{ value2 }}</p>

    <button @click="incrementChildValues">子组件增加值</button>
  </div>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

// 接收父组件传递的多个值
const props = defineProps({
  value1: {
    type: Number,
    required: true,
  },
  value2: {
    type: Number,
    required: true,
  },
});

// 子组件向父组件发送多个更新事件
const emit = defineEmits(['update:value1', 'update:value2']);

// 子组件方法:修改多个值并通知父组件
function incrementChildValues() {
  emit('update:value1', props.value1 + 1);
  emit('update:value2', props.value2 + 1);
}
</script>

工作原理

  1. 父组件的 v-model 绑定多个值

    • 在父组件中,通过 v-model:value1="parentValue1"v-model:value2="parentValue2" 分别将两个响应式的 ref 绑定到子组件的 value1value2
  2. 子组件的多个 modelValue

    • 在子组件中,使用 defineProps 来接收 value1value2,分别通过 props.value1props.value2 获取父组件传递的值。
  3. 子组件通过 emit 向父组件回传多个值

    • 当子组件修改某个值时,它通过 emit('update:value1', newValue)emit('update:value2', newValue) 向父组件回传新的值。
    • Vue 会自动更新父组件中的 parentValue1parentValue2
  4. 双向绑定

    • 父组件中的 parentValue1parentValue2 会根据子组件传回的值自动更新。
    • 子组件通过 v-model 获取到的 value1value2 会随着父组件值的变化而更新。

使用多个 v-model 时的注意事项

  • 自定义事件名称 :每个 v-model 都会对应一个 update:<propName> 的事件。如果你在子组件中使用多个 v-model,就需要为每个属性定义不同的 update:<propName> 事件(例如:update:value1, update:value2)。

  • 多个 v-model 的绑定 :Vue 3 支持通过多个 v-model 来绑定多个不同的属性,实现多重数据的双向绑定。

  • 响应式数据 :确保传递到子组件的 refreactive 数据是响应式的,只有这样父组件和子组件才能实现双向同步。

  • 组件清晰命名 :为了让代码更加易读,建议使用明确且符合语义的命名,比如 value1, value2,而不是使用同名的 modelValue


总结

使用多个 v-model 来实现多个属性的双向绑定是 Vue 3 中非常简便的做法。你可以根据需要传递多个响应式数据,并通过 update:<propName> 事件来更新这些数据。这种方式既简洁又灵活,能够很好地适应父子组件之间复杂的数据交互。

相关推荐
雨季66619 分钟前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
天人合一peng34 分钟前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
会飞的战斗鸡1 小时前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling1 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_177767372 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区2 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO2 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素
烬头88212 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos