使用v-model完成数据的双向绑定
创作灵感
面试问道了,没答出来,呜呜呜~
v-model实现双向绑定的原理
首先我们要知道,v-model实现的双向绑定其实只是props与emit的简化版本。其中,props负责父组件向子组件传递值,emit负责子组件向父组件传递值。
在不考虑v-model的使用情况下,我们要实现双向绑定,应当是父组件向子组件使用props传值,子组件接收到这个值以后,在子组件内部使用并监视这个值的改变,识别到其改变后,使用emit将新的值传递给父组件,父组件拿到新的值后再去更新该值。
上述情况这样做确实能完成双向绑定,但缺点就是太麻烦了,而且父组件自己还要手动去更新子组件的值,这就丢失了封装的意义了。因此,使用v-model简化这个过程就显得尤为重要了。下面向大家具体介绍一下v-model的使用:
v-model的具体使用
在使用v-model时,正常的格式一般需要指定父组件的哪个值和子组件的哪个值绑定。比如,我们需要绑定输入框组件的输入值,应当有v-model:子组件的值=父组件的值。但是我们在使用element-plus组件等时,发现别人封装的组件并未说明需要在使用v-model时指定子组件的值。这是因为v-model会默认绑定modelValue值。因此我们在封装组件时,如果向要实现v-model进行父子组件值的绑定,子组件就需要接收modeValue值,并监听这个值,如果其发生改变,则向父组件通知更新值。但传统的更新肯定是不行的,我们需要使用自动更新,在emit事件中,添加一个"updata:modelValue"事件即可。
下面就向大家展示一下v-model的一个具体使用:
父组件:
<template><div><searchComponent class="searchComponent" v-model="content" @returnResults="getResults"/><el-divider /><div class="show"> <el-empty v-if="users.data.length==0" description="空空如也~" /><div class="everyOne" v-else v-for="item in users.data" :key="item"><el-avatar class="everyOne-avatar" shape="square" :src="item.avatar_url" /><div class="everyOne-text"><el-text line-clamp="1" class="everyOne-name" size="small">姓名:{{ item.name }}</el-text><el-text line-clamp="1" class="everyOne-account" size="small">学号:{{ item.account }}</el-text><el-text line-clamp="1" class="everyOne-email" size="small">邮箱:{{ item.email }}</el-text></div><div class="everyOne-tag"><el-tag class="everyOne-sex" :type="item.sex=='male'?'primary':item.sex=='female'?'danger':'info'">{{ item.sex=='male'?'男':item.sex=='female'?'女':'保密' }}</el-tag><el-tag class="everyOne-isIdentification" :type="item.isIdentification=='0'?'info':'primary'">{{ item.isIdentification=='0'?'未认证':'已认证' }}</el-tag><el-tag class="everyOne-type" :type="item.type=='student'?'primary':'success'">{{ item.type=='student'?'学生':'教师' }}</el-tag></div><button class="everyOne-detail" @click="toUserDetail(item.id)">详情>></button></div></div><el-pagination v-if="total!=0" class="pagination" @current-change="changePage" background layout="prev, pager, next" :total="total" /></div>
</template><script lang="ts">
import { defineComponent, reactive, ref } from 'vue'
import API from '@/untils/axios'
import searchComponent from "@/components/searchComponent.vue"export default defineComponent({components:{searchComponent},setup(){var users:any=reactive({data:[]})var total=ref(0)var content=ref("2")function getResults(e:any){users.data=e.userstotal.value=e.totalcontent.value=e.content}function changePage(e:any){//改变当前页API.get("admin/changeUserPages",{params:{content:content.value,start:(e-1)*10}}).then((res:any|undefined)=>{if(res==undefined){return}users.data=res.data})}return{users,total,content,getResults,changePage}},methods:{toUserDetail(e:number){this.$router.push({path:"/home/manngerUser/searchUser/userDetail/"+e})}}
})
</script>
子组件:
<template><div class="mt-4"><el-inputv-model="content"style="max-width: 600px"placeholder="请输入用户信息"class="input-with-select"><template #prepend><el-select v-model="select" placeholder="账号" style="width: 115px"><el-option :disabled="noSelect==1" label="账号" value="1" /><el-option :disabled="noSelect==2" label="姓名" value="2" /></el-select></template><template #append><el-button @click="search" icon="Search" /></template></el-input></div>
</template><script lang="ts">
import { defineComponent,reactive, ref, toRaw,watch } from 'vue'
import API from '@/untils/axios'
import { ElMessage } from 'element-plus'export default defineComponent({props:['noSelect','modelValue'],emits:["returnResults","update:modelValue"],name:"searchComponent",setup(props,emits){var content=ref(props.modelValue)watch([content],(newValue)=>{emits.emit("update:modelValue",newValue[0])},{deep:true})var select=ref("1")var users=reactive({//返回的前十位用户信息data:[]})var total=ref(0)return{select,users,total,//总的记录数content}},methods:{search(){if(this.content==""){ElMessage({message:"搜索值为空",type:"warning"})return}API.get("admin/searchUsers",{params:{type:this.select,content:this.content }}).then((res:any)=>{if(res==undefined){return}if(res.data.users.length==0){ElMessage({message:"搜索为空",})} else {ElMessage({message:"搜索成功",type:"success"})}this.users.data=res.data.usersthis.total=res.data.totalvar result={users:toRaw(this.users.data),//搜索出来的前10位信息total:this.total,content:this.content}this.$emit("returnResults",result)})}}
})
</script>
上述案例中,父组件使用了v-model,但未指定子组件需绑定的值,因此会默认绑定modeValue,子组件在监视该值时,使用"update:modeValue"进行自动更新。通过上述方法便可实现父子组件间的双向绑定了。
总结
一般来说,要想实现父子组件间的双向绑定,就是父组件向子组件通信,子组件向父组件通信的一个过程。而v-model就是简化了这一双向过程。感谢观看!
相关文章:
使用v-model完成数据的双向绑定
创作灵感 面试问道了,没答出来,呜呜呜~ v-model实现双向绑定的原理 首先我们要知道,v-model实现的双向绑定其实只是props与emit的简化版本。其中,props负责父组件向子组件传递值,emit负责子组件向父组件传递值。 在…...

如何使用Android NDK将头像变成“遗像”
看完本文的标题,可能有人要打我。你说黑白的老照片不好吗?非要说什么遗像,我现在就把你变成遗像!好了,言归正传。我想大部分人都用过美颜相机或者剪映等软件吧,它们的滤镜功能是如何实现的,有人…...

python判断字符串是否为回文串的详细解析与实现
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:回文串的定义与背景 二、判断回文串的基本思路 示例解析 三、代码实…...

148.【Windows DOS命令脚本文件】
Window待处理脚本 (一)、批处理编程初步体验1.什么是批处理程序?(1).批处理程序的定义(2).如何编辑批处理程序 2.批处理程序可以做什么?(1).匹配规则删除文件(2).新建文件,日志等(3).创建计算机病毒等 3.一个基本的批处理文件(1).带盘符的输出…...

推荐网站(13)plantumlb自动帮我们创建 UML 图表
今天推荐一个网站plantumlb,它可以自动帮我们创建 UML 图表。 plantumlb网站中的PlantUML是一个开源工具,它允许用户使用简单的文本描述来创建UML(统一建模语言)图表。PlantUML支持多种类型的UML图表,包括用例图、类图…...

【vue-1】vue入门—创建一个vue应用
最近在闲暇时间想学习一下前端框架vue,主要参考以下两个学习资料。 官网 快速上手 | Vue.js b站学习视频 2.创建一个Vue3应用_哔哩哔哩_bilibili 一、创建一个vue3应用 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…...

【微信小程序开发】小程序前后端交互--发送网络请求实战解析
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【NOIP2013普及组复赛】题2:表达式求值
题2:表达式求值 【题目描述】 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。 【输入文件】 输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “ ” “” “”和乘法运算符 “ ∗ ” “…...

datasheet芯片数据手册—新手入门学习(二)【8-18】
参考芯片手册已经上传,可自行下载 因为芯片参考手册内容比较多,故再一次介绍本文内容主要讲解章节。 目录 8、内容介绍 命令真值表 9、Command Definitions 10、READ Operations (1)页面读取操作 (2ÿ…...

UE5 双手握剑的实现(逆向运动学IK)
UE5 双手握剑的实现 IK 前言 什么是IK? UE官方给我们提供了很多对于IK处理的节点,比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等,但是看到这,很多人就好奇了,什么是IK? 首先我们来看看虚幻小白人的骨…...
Java中的接口(Interface)及其与抽象类的区别
一、技术难点 在Java中,接口是一种完全抽象的类,主要用于定义一组方法的规范,但不提供具体的实现。接口的技术难点主要体现在以下几个方面: 方法的定义与实现分离:接口只定义了方法的签名,没有方法体&…...

代码随想录算法训练营第十四天(py)| 二叉树 | 递归遍历、迭代遍历、统一迭代
1 理论基础 1.1 二叉树的种类 满二叉树 只有度为0和2的节点,且度为0的节点在同一层。 深度为k,有2^k-1个节点 完全二叉树 除了最底层可能没填满,其余每层节点数都达到最大。并且最底层节点全部集中在左边。 二叉搜索树 是一个有数值…...
Golang并发编程-协程goroutine初体验
文章目录 前言一、Goroutine适合的使用场景二、Goroutine的使用1. 协程初体验 三、WaitGroupWaitGroup 案例一WaitGroup 案例二 总结 前言 学习Golang一段时间了,一直没有使用过goroutine来提高程序执行效率,在一些特殊场景下,还是有必须开启…...

驱动与系统学习网址
DRM(Direct Rendering Manager)学习简介-CSDN博客 Android Qcom Display学习(零)-CSDN博客 https://blog.csdn.net/hexiaolong2009/category_9705063.htmlhttps://blog.csdn.net/hexiaolong2009/category_9705063.htmlRender Hell —— 史上最通俗易懂…...
OAuth2.0
OAuth2.0 OAuth2.0是一种授权框架,用于授权第三方应用访问用户资源的方式。它允许用户将自己的信息(如照片、视频等)存储在一个服务提供商中,然后授权第三方应用访问这些信息,而无需提供用户名和密码给第三方应用。OAu…...
测试testing10
测试testing10...
在Java中实现泛型(Generics)的深入解析
在Java中,泛型(Generics)是一个强大的工具,它允许我们在编译时定义类型参数,使代码更加灵活、可重用和类型安全。下面,我将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面,详细解析…...
每周题解:繁忙的都市
题目链接 繁忙的都市 题目描述 城市 C 是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的:城市中有 n n n 个交叉路口,有些交叉路口之间有道路相连,两…...

linux之防火墙工具
netfilter Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中。 Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户…...
【Python】—— 高阶函数
目录 (一)体验高阶函数 (二)内置高阶函数 2.1 map() 2.2 reduce() 2.3 filter() Python中的高阶函数是指那些接受函数作为参数,或者返回函数作为结果的函数。这种特性让Python的函数编程能力非常强大&…...

uniapp Vue2 获取电量的独家方法:绕过官方插件限制
在使用 uniapp 进行跨平台应用开发时,获取设备电量信息是一个常见的需求。然而,uniapp 官方提供的uni.getBatteryInfo方法存在一定的局限性,它不仅需要下载插件,而且目前仅支持 Vue3,这让使用 Vue2 进行开发的开发者陷…...

natapp 内网穿透失败
连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
一、问题描述 旅行商问题(TSP)是一个经典的组合优化问题。给定一个无向图,图中的顶点表示城市,边表示两个城市之间的路径,边的权重表示路径的距离。一个售货员需要从驻地出发,经过所有城市后回到驻地&…...
CSS6404L 在物联网设备中的应用优势:低功耗高可靠的存储革新与竞品对比
物联网设备对存储芯片的需求聚焦于低功耗、小尺寸、高可靠性与传输效率,Cascadeteq 的 CSS6404L 64Mb Quad-SPI Pseudo-SRAM 凭借差异化技术特性,在同类产品中展现显著优势。以下从核心特性及竞品对比两方面解析其应用价值。 一、CSS6404L 核心产品特性…...

Server2003 B-1 Windows操作系统渗透
任务环境说明: 服务器场景:Server2003(开放链接) 服务器场景操作系统:Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的…...

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头,1是第二个摄像头,传递视频文件路径也可以 …...
CCPC chongqing 2025 H
题目链接:https://codeforces.com/gym/105887 题目背景: 方框上有上下两排小球,下面的紧贴框底,上面的部分贴框顶,每牌小球上都有一个一个数字(1~n),将相同的小球连接到一起,是否在不交叉的情况…...
动静态库的使用(Linux)
1.库 通俗来说,库就是现有的,可复用的代码,例如:在C/C语言编译时,就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

【图片识别Excel】批量提取图片中的文字,图片设置识别区域,识别后将文字提取并保存Excel表格,基于WPF和OCR识别的应用
应用场景 在办公自动化、文档处理、数据录入等场景中,经常需要从大量图片中提取文字信息。例如: 批量处理扫描的表单、合同、发票等文档从图片集中提取特定区域的文字数据将纸质资料快速转换为电子文本并整理归档 通过设置识别区域,可以精…...
【区块链基础】区块链的 Fork(分叉)深度解析:原理、类型、历史案例及共识机制的影响
区块链的 Fork(分叉)全面解析:原理、类型、历史案例及共识机制的影响 在区块链技术的发展过程中,Fork(分叉)现象是不可避免且极具影响力的一个环节。理解区块链分叉的形成原因、具体表现以及共识机制对分叉的作用,对于深入把握区块链技术架构及其治理机制至关重要。 本…...