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

Vue3父子组件数据同步方法

在 Vue 3 中,当子组件需要修改父组件传递的数据副本并同步更新时,可以通过以下步骤实现:

方法 1:使用 v-model 和计算属性(实时同步)

父组件

vue

<template><ChildComponent v-model="parentData" />
</template><script setup>
import { ref } from 'vue';
const parentData = ref(initialValue);
</script>

子组件

vue

<template><input v-model="modelValueComputed" />
</template><script setup>
import { computed } from 'vue';const props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);// 计算属性实现双向绑定
const modelValueComputed = computed({get: () => props.modelValue,set: (value) => emit('update:modelValue', value)
});
</script>

方法 2:使用副本和侦听器(实时同步)

父组件同上。

子组件

vue

<template><input v-model="localData" />
</template><script setup>
import { ref, watch } from 'vue';const props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);// 创建副本
const localData = ref(props.modelValue);// 监听本地副本变化,同步到父组件
watch(localData, (newVal) => {emit('update:modelValue', newVal);
});// 监听父组件数据变化,更新副本
watch(() => props.modelValue, (newVal) => {localData.value = newVal;
});
</script>

方法 3:手动触发更新(如提交按钮)

父组件

vue

<template><ChildComponent :data="parentData" @update="handleUpdate" />
</template><script setup>
import { ref } from 'vue';
const parentData = ref(initialValue);const handleUpdate = (newVal) => {parentData.value = newVal;
};
</script>

子组件

vue

<template><input v-model="localData" /><button @click="submit">提交</button>
</template><script setup>
import { ref, watch } from 'vue';const props = defineProps(['data']);
const emit = defineEmits(['update']);// 初始化副本
const localData = ref(props.data);// 父组件数据变化时更新副本
watch(() => props.data, (newVal) => {localData.value = newVal;
});const submit = () => {emit('update', localData.value);
};
</script>

关键点说明:

  1. 副本创建:子组件通过 ref 或 reactive 创建数据的副本,避免直接修改 Props。

  2. 数据同步

    • 实时同步:通过 watch 监听副本变化并触发事件 (emit),同时监听 Props 更新副本。

    • 手动同步:在用户操作(如点击按钮)时提交修改。

  3. 双向绑定:利用 v-model 语法糖简化父子通信,自动处理 Prop 和事件。

  4. 更新策略:根据场景选择是否实时同步或手动同步,避免循环更新或数据不一致。

注意事项:

  • 深拷贝:如果传递的是对象/数组,需使用深拷贝(如 JSON.parse(JSON.stringify(props.data)))避免引用问题。

  • 性能:频繁的 watch 可能影响性能,复杂场景可考虑防抖或优化监听逻辑。

  • 数据一致性:父组件更新后,若需子组件副本同步,务必监听 Prop 变化并更新副本。

相关文章:

  • AtCoder Beginner Contest 402题解
  • 云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)
  • 华为开发岗暑期实习笔试(2025年4月16日)
  • 配置kafka与spark连接
  • Unity导入GLB模型 需要用到这个插件
  • 基于CBOW模型的神经网络词向量转换原理与实践
  • 音视频小白系统入门课-4
  • leetcode-位运算
  • 搭建TypeScript单元测试环境
  • JWT的token泄露要如何应对
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目3
  • QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
  • CIFAR-10图像分类学习笔记(一)
  • 同样的接口用postman/apifox能跑通,用jmeter跑就报错500
  • HarmonyOS Grid 网格列表可长按 item 拖动移动位置
  • Shopee五道质检系统重构东南亚跨境格局,2025年电商游戏规则悄然改写
  • QT容器类控件及其属性
  • 文件属性隐写
  • 模型 观测者效应
  • Go协程的调用与原理
  • 央行上海总部:受益于过境免签政策,上海市外卡刷卡支付交易量稳步增长
  • 习近平同肯尼亚总统鲁托会谈
  • 云南洱源县4.8级地震:房屋受损442户,无人员伤亡报告
  • 大家聊中国式现代化|彭羽:为国家试制度探新路,推进高水平对外开放
  • 宁夏中卫深化公立医院机构编制改革:市人民医院机构规格升为正处级
  • 中纪报刊文:新时代反腐败斗争为党赢得历史主动