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

Vue 3 中父子组件双向绑定的 4 种方式

🔁 Vue 3 中父子组件双向绑定的 4 种方式

整理不易,点赞 + 收藏 + 关注,助你组件通信不再混乱!


✅ 场景说明

  • 父组件希望将某个值传递给子组件,同时希望子组件能够修改这个值(实现“绑定 + 反向更新”)。
  • 类似于 v-model 的使用效果。

🧩 方式一:使用 v-model + modelValue + emit("update:modelValue")

✅ 推荐:官方支持、语义清晰、适用于表单类组件

子组件写法:

<!-- components/MyInput.vue -->
<template><input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template><script setup>
defineProps({modelValue: String
})
defineEmits(['update:modelValue'])
</script>

父组件用法:

<MyInput v-model="username" />

🧩 方式二:自定义 v-model:xxx 实现多个绑定值

✅ 多值绑定场景适用,例如表单组件同时绑定 valuechecked

子组件:

<template><input:value="modelValue":checked="checked"@input="$emit('update:modelValue', $event.target.value)"@change="$emit('update:checked', $event.target.checked)"/>
</template><script setup>
defineProps(['modelValue', 'checked'])
defineEmits(['update:modelValue', 'update:checked'])
</script>

父组件:

<MyInput v-model:modelValue="text" v-model:checked="isChecked" />

🧩 方式三:使用 v-bind + @update + defineModel(Vue 3.3+)

⚠️ 仅支持 Vue 3.3 及以上版本!

子组件:

<script setup>
const model = defineModel<string>()  // 等价于 props + emit
</script><template><input :value="model" @input="model = $event.target.value" />
</template>

父组件:

<MyInput v-model="msg" />

✔️ 不用显式声明 props 和 emits,推荐新项目使用!


🧩 方式四:手动通过 props + emit 自定义字段实现绑定

✅ 适合非表单类组件 / 业务交互逻辑强的组件

子组件:

<template><button @click="toggle">{{ active ? 'ON' : 'OFF' }}</button>
</template><script setup>
const props = defineProps({ active: Boolean })
const emit = defineEmits(['update:active'])const toggle = () => {emit('update:active', !props.active)
}
</script>

父组件:

<MyToggle v-model:active="isActive" />

🧠 小结对比表

方式特点场景建议
v-model + modelValue最常用,官方推荐表单组件
v-model:xxx 多 model绑定多个值复合组件(如 input + checked)
defineModel()Vue 3.3+ 自动绑定新项目、轻量双绑组件
props + emit 自定义字段自定义灵活任意双向控制场景

✅ 补充:实现“子改父”但不一定是“绑定”

  • 子组件调用函数修改父组件数据:
<!-- 父组件 -->
<MyChild :value="count" @change="count = $event" /><!-- 子组件 -->
$emit('change', newValue)
  • 父传 ref,子组件直接修改 ref.value(不推荐频繁使用)
http://www.dtcms.com/a/271271.html

相关文章:

  • 如何将 AWS EBS 卷从 gp2 批量迁移到 gp3:完整指南
  • 基于Spring Boot+Vue的DIY手工社预约管理系统(Echarts图形化、腾讯地图API)
  • [Pytest][Part 4]多种测试运行方式
  • docker部署华为高斯数据库opengauss(arm版本)
  • 1.1 ARMv8/ARMv9安全扩展
  • 解决SQL Server SQL语句性能问题(9)——SQL语句改写(6)
  • 【PDF提取内容改名】批量提取pdf多个指定区域内容到excel表格的操作步骤和方法
  • NLP革命二十年:从规则驱动到深度学习的跃迁
  • Spring Boot 项目中多数据源配置使用场景
  • 美股异动|机器人概念表现活跃,微美全息(WIMI.US)瞄准高增长赛道涨超14%
  • 丰田将协作机器人与现有设备相结合,以实现超高负载能力和安全性
  • 焊接机器人智能节气装置
  • Deepoc具身智能大模型:物流机器人的神经中枢如何重塑现代供应链
  • Android ttyS2无法打开该如何配置 + ttyS0和ttyS1可以
  • 板凳-------Mysql cookbook学习 (十一--------6)
  • Android 12 - 部分相机横屏显示方案
  • Docker高级管理--容器通信技术与数据持久化
  • 记录跟随recyclerview滑动的指示器
  • 智能避让+自动换针:三坐标让汽车检具测量安全又高效
  • 小鹏汽车6月交付车辆34,611辆,同比增长224%
  • 实现子系统深度融合,IBMS系统消除信息孤岛释放价值潜力
  • 云成本优化的核心原则与框架
  • React 编译器与性能优化:告别手动 Memoization
  • App中分发中的防盗链开发是做什么的?
  • 米思齐2.0 3.0 mixly arduino 编程软件下载安装及详情使用指南 导入库文件方法 支持8266 esp32
  • # 如何让微软 Edge 浏览器以 IE 模式打开某些网站?
  • APP上架怎么避免麻烦应对解决方案和替代方案
  • Spring State Machine
  • git上传大文件启用LFS git报错 the remote end hung up unexpectedly
  • 数学建模:非线性规划:二次规划问题