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

【Vue3】使用v-model实现父子组件通信(常用在组件封装规范中)

历史小剧场

历史告诉我们,痞子就算混一辈子,也还是痞子,滑头,最后只能滑自己。长得帅,不能当饭吃。
成大器者的唯一要诀,是能吃亏。
吃亏就是占便宜,原先我不信,后来我信了,相当靠谱。----《明朝那些事儿》

概述

v-mode实现父子组件数据同步原理主要分为:

  • 父组件添加modelValue绑定数据且传递到子组件,然后绑定@update:modelValue事件接收子组件传过来的值
  • 子组件内部使用defineProps来接收父组件modelValue传过来的值,使用defineEmits自定义事件修改值然后触发父组件@update绑定的事件

同步单个数据

父组件

<!--  -->
<template><div><!-- v-model用在HTML--><!-- <input type="text" v-model="username"> --><!-- <input type="text" :value="username" @input="username = (<HTMLInputElement>$event.target)!.value" /> --><h4>账号: {{ username }}</h4><h4>密码: {{ pwd }}</h4><!-- v-model用在自定义组件上 --><!-- <XinchaoInput v-model:username="username" v-model:pwd="pwd" /> --><XinchaoInput :username="username"@update:username="username = $event" /></div>
</template><script setup lang="ts">
import { ref, watch } from 'vue';
import XinchaoInput from './XinchaoInput.vue';const username = ref<string>("张三")
const pwd = ref<string>("123131")
watch(username, (oldValue, newValue) => {console.log(newValue)
})
</script><style lang="scss" scoped></style>

子组件

<!--  -->
<template><div><input type="text":value="username"@input="emit('update:username', (<HTMLInputElement>$event.target)!.value)" /><!-- <br><input type="text":value="pwd"@input="emit('update:pwd', (<HTMLInputElement>$event.target)!.value)" /> --></div>
</template><script setup lang="ts">
defineProps(['username', 'pwd'])
const emit = defineEmits(['update:username', 'update:pwd'])</script><style lang="scss" scoped>
input {border: 2px solid #ccc;border-radius: 5px;padding: 2px;background-color: darkcyan;color: white;
}
</style>

同步多个数据

父组件

<!--  -->
<template><div><!-- v-model用在HTML--><!-- <input type="text" v-model="username"> --><!-- <input type="text" :value="username" @input="username = (<HTMLInputElement>$event.target)!.value" /> --><h4>账号: {{ username }}</h4><h4>密码: {{ pwd }}</h4><!-- v-model用在自定义组件上 --><XinchaoInput v-model:username="username" v-model:pwd="pwd" /><!-- <XinchaoInput :username="username"@update:username="username = $event" /> --></div>
</template><script setup lang="ts">
import { ref, watch } from 'vue';
import XinchaoInput from './XinchaoInput.vue';const username = ref<string>("张三")
const pwd = ref<string>("123131")
watch(username, (oldValue, newValue) => {console.log(newValue)
})
</script><style lang="scss" scoped></style>

子组件

<!--  -->
<template><div><input type="text":value="username"@input="emit('update:username', (<HTMLInputElement>$event.target)!.value)" /><br><input type="text":value="pwd"@input="emit('update:pwd', (<HTMLInputElement>$event.target)!.value)" /></div>
</template><script setup lang="ts">
defineProps(['username', 'pwd'])
const emit = defineEmits(['update:username', 'update:pwd'])</script><style lang="scss" scoped>
input {border: 2px solid #ccc;border-radius: 5px;padding: 2px;background-color: darkcyan;color: white;
}
</style>

相关文章:

  • Part 4.2 背包动态规划
  • 适用于 macOS 的最佳免费数据恢复软件
  • 浏览器必装插件推荐:最新版Simple Allow Copy,解除网页复制限制!
  • Arcgis投影问题
  • 在mysql中GROUP_CONCAT字段的作用
  • vivado PIN
  • Adam优化算法
  • 找工作小项目:day16-重构核心库、使用智能指针(2)
  • 数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践
  • go 定时任务
  • 多目标跟踪中用到的求解线性分配问题(Linear Assignment Problem,LAP)C++
  • 苏州辰安塑业携塑料托盘、塑料物流箱解决方案亮相2024杭州快递物流展
  • 音视频开发_SDL音频播放器的实现
  • vue+intro.js实现引导功能
  • 离散数学--连通性和矩阵
  • angular2开源库收集
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • golang中接口赋值与方法集
  • mysql常用命令汇总
  • Node + FFmpeg 实现Canvas动画导出视频
  • TypeScript迭代器
  • 前端
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一起参Ember.js讨论、问答社区。
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #mysql 8.0 踩坑日记
  • (160)时序收敛--->(10)时序收敛十
  • (3) cmake编译多个cpp文件
  • (9)目标检测_SSD的原理
  • (二)c52学习之旅-简单了解单片机
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)图像的%2线性拉伸
  • (未解决)macOS matplotlib 中文是方框
  • (转)fock函数详解
  • .java 9 找不到符号_java找不到符号
  • .Net Core 中间件与过滤器
  • .NET Micro Framework初体验
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET企业级应用架构设计系列之开场白
  • .NET企业级应用架构设计系列之应用服务器
  • .net下的富文本编辑器FCKeditor的配置方法
  • .Net中wcf服务生成及调用
  • [ C++ ] STL---string类的使用指南
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [4.9福建四校联考]
  • [C语言]——函数递归
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [HDCTF 2023]Welcome To HDCTF 2023
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式