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. 副本创建 :子组件通过 refreactive 创建数据的副本,避免直接修改 Props。

  2. 数据同步

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

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

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

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

注意事项:

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

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

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

相关推荐
IT_陈寒2 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen2 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher2 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙3 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
牧艺3 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
jump_jump3 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
红尘散仙3 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队4 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端4 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream4 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端