当前位置: 首页 > ai >正文

Vue3父子组件数据双向同步实现方法

在 Vue 3 中,实现父子组件间双向同步响应式对象的步骤如下:

实现思路

  1. 父组件通过 v-model 传递响应式对象。

  2. 子组件接收并深拷贝为本地副本。

  3. 子组件监听父组件的数据变化,更新本地副本(不触发同步)。

  4. 子组件监听本地副本的变化,触发同步事件(排除父组件更新引起的变更)。

  5. 使用标志位 isUpdatingFromParent 区分变更来源,避免循环更新。

代码实现

父组件

vue

<template><Child v-model="parentData" />
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const parentData = ref({name: 'Parent',info: { id: 1 }
})
</script>
子组件

vue

<template><input v-model="localCopy.name"><input v-model="localCopy.info.id" type="number">
</template><script setup>
import { ref, watch, nextTick } from 'vue'const props = defineProps({modelValue: {type: Object,required: true}
})const emit = defineEmits(['update:modelValue'])// 深拷贝创建本地副本
const localCopy = ref(JSON.parse(JSON.stringify(props.modelValue)))// 标志位:是否来自父组件的更新
let isUpdatingFromParent = false// 监听父组件数据变化
watch(() => props.modelValue,async (newVal) => {isUpdatingFromParent = truelocalCopy.value = JSON.parse(JSON.stringify(newVal)) // 深拷贝更新await nextTick()isUpdatingFromParent = false},{ deep: true }
)// 监听本地副本变化
watch(localCopy,(newVal) => {if (!isUpdatingFromParent) {emit('update:modelValue', JSON.parse(JSON.stringify(newVal)))}},{ deep: true }
)
</script>

关键点说明

  1. 深拷贝处理:使用 JSON.parse(JSON.stringify()) 确保副本与原数据无引用关系。

  2. 双向监听机制

    • 父 → 子:监听 props.modelValue,更新副本时标记来源,避免触发同步。

    • 子 → 父:监听 localCopy,非父组件更新时触发同步事件。

  3. 防循环处理:通过 isUpdatingFromParent 和 nextTick() 确保父组件更新不会触发子组件同步。

注意事项

  • 性能优化:深拷贝不适合大型对象,可改用 structuredClone 或工具库(如 lodash 的 _.cloneDeep)。

  • 响应式类型:如果父组件使用 reactive(),需确保 props.modelValue 是响应式引用。

  • 结构稳定性:对象结构变化(增删属性)时,需重新深拷贝避免数据不一致。

http://www.xdnf.cn/news/1430.html

相关文章:

  • canoe 利用log进行故障重现方式
  • [架构之美]Ubuntu源码部署APISIX全流程详解(含避坑指南)
  • CSS初识
  • 测试基础笔记第十天
  • c++的jsoncpp使用
  • jdk17的新特性
  • Linux命令-sar
  • Java_day25-29
  • 扣子空间 (Coze Space) 使用入门,邀请码获取指南
  • Unity 创建、读取、改写Excel表格数据
  • c++中的enum变量 和 constexpr说明符
  • 策略模式:动态切换算法的设计智慧
  • 安装win11自带linux是报错:WslRegisterDistribution failed with error: 0x800701bcErr
  • 使用rclone迁移minio文件
  • PHP 反序列化CLI 框架类PHPGGC 生成器TPYiiLaravel 等利用
  • 深入微服务核心:从架构设计到规模化
  • Openharmony 和 HarmonyOS 区别?
  • RecyclerView中实现横向左滑加载更多功能
  • 【鸿蒙HarmonyOS】深入理解router与Navigation
  • MOS管驱动电路以及阻值选取
  • ⭐Unity 开发 | 如何通过 NTP 网络时间实现精准的跨平台时间同步【附完整源码 + UI 模块 + 偏差分析】
  • UE5的 Modify Curve 蓝图节点
  • L1-107 高温补贴 - java
  • HBuilder压缩文件教程
  • 滑动窗口算法(一)
  • Python类和对象二(十一)
  • 深度学习中的黑暗角落:梯度消失与梯度爆炸问题解析
  • 制作一款打飞机游戏19:碰撞检测
  • 【双指针】有效三角形的个数
  • 香港科技大学广州|金融科技学域博士招生宣讲会—南开大学专场