Vue 2升级 Vue 3初探小细节

【导读】嗯,偶尔看看学习Vue 3技能啦,此前用过Vue 2做过一点东西,Vue 3已面世一段时间,于是乎,我来看看所遇到的问题是否在Vue 3中得到解决

首先,我们来讲讲一个例子在Vue 2中的实现,举个栗子吧,开发过程中我们只会用到省、市、区,这里的区也可以看做是三、四线城市中的县,若我们想要基于县动态创建镇、村,更有甚者,在全国各地在镇下还划分不同的区域,我们通过Vue结合ElementUI来实现此例子

Vue 2 + ElementUI

由于示例代码比较多,这里我们首先直接看效果,如下:

具体代码如下所示,太多?忽略不看,我们只讲解核心问题

<el-dialog :modal="dialogModal" :title="townTitle" @close="closeDialog" :visible.sync="dialogVisible" :close-on-click-modal="false"  width="800px" top="10vh" center><el-row><el-form label-width="40px" ref="form" size="mini"><el-form-item><el-button size="small" @click="createMultipleTown" icon="el-icon-plus">添加镇</el-button></el-form-item><el-form-item v-for="(town, tindex) in form.towns" :key="tindex" style="border: 1px dashed #AAAAAA;margin:10px 0 20px 0;"><el-row style="margin:20px 0 20px 0;"><el-col :span="19"><el-button type="danger" size="small" icon="el-icon-delete" @click="removeTown(tindex)">移除镇</el-button></el-col></el-row><el-row style="margin:20px 0 20px 0;"><el-col :span="4">镇名称</el-col><el-col :span="19"><el-input maxlength="30" v-model="town.townName" placeholder="请输入镇名称"></el-input></el-col></el-row><el-row style="margin-bottom:20px;"><el-col :span="4">区域、村</el-col><el-col :span="20"><el-radio-group v-model="town.option"><el-radio @change="dynamicAddRegion(tindex)" label="添加区域"></el-radio><el-radio label="添加村" @change="dynamicAddVillage(tindex)"></el-radio></el-radio-group></el-col></el-row><el-row v-for="(region, rindex) in town.regions"  :key="rindex" style="margin-bottom:20px;"><el-row><el-col :span="4">{{region.regionTitle}}</el-col><el-col :span="5" style="margin-right:20px;" v-show="town.townRegionVisible"><el-input size="small" maxlength="30" v-model="region.regionName" placeholder="请输入区域名称"></el-input></el-col><el-col :span="5" style="margin-right:20px;"><el-tooltip class="item" effect="dark" content="输入村名称并回车,即可连续添加" placement="top"><el-input  size="small" maxlength="30" v-model="region.villageName" @keyup.enter.native="getVillage(tindex, rindex)" placeholder="请输入村名称"></el-input></el-tooltip></el-col><el-col :span="5" v-show="!town.townRegionVillageVisible"><el-button size="small" icon="el-icon-plus"  @click="continueAddRegion(tindex)">追加区域</el-button></el-col><el-col :span="3"  v-show="!town.townRegionVillageVisible" style="width:100px;"><el-button size="small" type="danger" icon="el-icon-delete"  @click="removeRegion(tindex, rindex)">移除区域</el-button></el-col></el-row><el-row><el-col :span="4"><span>&nbsp;&nbsp;</span></el-col><el-col :span="20"><el-tag  :key="tagindex" v-for="(tag, tagindex) in region.tags" closable :disable-transitions="false" style="margin:10px 10px 0 0;"  @close="handleClose(tindex, rindex, tagindex)">{{tag}}</el-tag></el-col></el-row></el-row></el-form-item></el-form></el-row><el-row v-show="saveButtonVisible"><el-col :span="20"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></el-col><el-col :span="2"><el-button  @click="save" type="primary">确定</el-button></el-col><el-col :span="1"><el-button  @click="cancel">取消</el-button></el-col></el-row>
</el-dialog>

直接看如下定义数据结构可得知,存在三层遍历,第一层遍历从镇开始,第二层遍历从镇下区域开始,最后一层遍历则是区域下的村(即上述标签)

form: {areaId: 0,towns: [{townName: '',regions: [{regionTitle: '',regionName: '',villageName: '',tags: []}]}]}

在Vue 2中一直存在的问题则是无法监听数组,若我没记错的话,Vue 2是通过Object.defineProperty()来监听对象,也就是后台语言中对应的属性get和set方法

结合上述示例图和代码,当我们输入村名称时,然后回车,则将村名称添加到村数组中去,然后通过el-tag标签进行遍历渲染

接下来问题来了,此时我们想要删除村,所以点击村标签的删除图标,毫无疑问直接将区域下的村数组通过索引将其移除即可,但是,但是,根本无法移除,因为此时区域下的村是一个数组,Vue 2无法监听得到,也就是我们在数组中给对应村移除时,但页面上无法同步删除,移除方法如下:

handleClose (tindex, rindex, tagindex) {let self = thislet region = self.form.towns[tindex].regions[rindex]region.tags.splice(tagindex, 1)
},

那么在Vue 2中如何解决这个问题呢?根据我们的示例来看,我们将输入的村名称即文本框绑定回车事件,然后将文本框绑定的模型数据添加到村数组中去,所以此时我们假装先再次在文本框上绑定一个“占位符”,然后紧接着将其置空,给Vue 2一种“错觉”刚才的数据没绑定上,所以上述删除标签方法,变成如下即可解决:

handleClose (tindex, rindex, tagindex) {let self = thislet region = self.form.towns[tindex].regions[rindex]region.tags.splice(tagindex, 1)// 添加文本准备添加“一个占位符”,以便于页面上能删除标签region.villageName = '占位符'region.villageName = ''
},

Vue 3 + ElementPlus

空闲之余,试了试Vue 3结合ElementPlus,这个问题得到了解决,在Vue 3中通过proxy(代理)方式监听所有属性,当然也就包括数组,然后在Vue 3中相关键盘事件等,比如回车,都已通过v-on:key.enter来绑定事件实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析

随着新版本的到来&#xff0c;这次推出了两个混沌团本&#xff0c;分别是影子军团祭坛、月光船长要塞。三个10人新团本&#xff0c;分别是迷宫集会堂、路贝里斯克、不灭神殿。混沌团本可以掉落橙装&#xff0c;新团本则可以掉落专属武器。影子军团祭坛是我们的两大混沌本之一&a…

薛定谔的猫——.NET 4.1 中的新基类,开源Preview中

前言&#xff1a; 昨天一如既往地登上forums.asp.net答帖子&#xff0c;却被上面的一条滚动新闻雷到了&#xff1a; .NET 4.1 Preview - New Base Class Library (BCL) Extension Methods - RFC 因为考虑到April 1st的关系&#xff0c;这是Scott Hanselman给大家开的玩笑&…

史上最硬核文科生,擅长解决数学难题,却视考试成为终生噩梦

全世界只有3.14 %的人关注了青少年数学之旅“数学存在的价值&#xff0c;不只是为了生活上的应用&#xff0c;它不应沦为供工程、商业应用的工具&#xff0c;数学的突破仍需要不断地去突破现有格局。”——节选自《数学之旅 闪耀人类的54个数学家》他是一位浪漫的法国人&#…

胡晓曼:MindSpore 开源运营与治理 | DEV. Together 2021 中国开发者生态峰会

内容来源&#xff1a;2021 年 6 月 5 日&#xff0c;由 SegmentFault 思否主办的 2021 中国开发者生态峰会圆满落幕。会上&#xff0c;华为 MindSpore 运营总监胡晓曼发表了主题为《MindSpore 开源运营与治理》的演讲。分享嘉宾&#xff1a;胡晓曼&#xff0c;华为 MindSpore 运…

C# 语言特性

Codeusing System;using System.Collections.Generic;using System.Text;namespace InterfaceShadow{ interface ISomeInterface { void DoSomething(); } class Class1 : ISomeInterface { #region ISomeInterface 成员 public void DoSo…

如何掌握C#的核心技术

如何掌握C#的核心技术原图来自网络&#xff0c;如有侵权&#xff0c;请联系小编删除。引子前不久看到一个段子&#xff0c;某年宁波交警引进人脸识别技术抓拍行人闯红灯&#xff0c;结果一天下来被发现闯红灯次数最多的是珠海女子董小姐&#xff0c;日闯红灯3000多次。宁波交警…

怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。

全世界只有3.14 %的人关注了青少年数学之旅提到乔布斯&#xff0c;大家会想到什么呢&#xff1f;苹果公司创始人&#xff1f;iPhone手机&#xff1f;iPad?人生赢家&#xff1f;不过大家肯定没有想到乔布斯也有吃瘪的时候&#xff1a;有一次&#xff0c;乔布斯对电动平衡车赛格…

祝贺|合肥.NET俱乐部第二期技术沙龙活动圆满成功

热烈祝贺合肥.NET俱乐部第二期技术沙龙圆满成功&#xff0c;感恩参与活动的每一位小伙伴&#xff01;正是因为有你们才促成了这次聚会的成功。现对此次活动进行简单回顾并附上精彩的活动图片&#xff0c;每一位参与活动者名单&#xff0c;以及此次活动讲师分享的PPT供大家学习下…

几个常用的JS代码.

//函数列表function PostCookie(cookieName) { var expdate new Date(); expdate.setTime(expdate.getTime() 604800000); document.cookiecookieName";expires"expdate.toGMTString()";path /;domain.52z.com"; }//用于产生随机轮转广告 i 随机个…

SQL中合并多行记录的方法总汇

SQL中合并多行记录的方法总汇——前几天还在抱怨&#xff1a;sql只有sum(数值)&#xff0c;不能sum(字符串)——如果不是分组统计&#xff0c;用select values values , value也是可以的——但是如果是分组sum(字符串)&#xff0c;肯定不行了&#xff01;——下面是用函数实…

Python中文编码判别及转换

为什么80%的码农都做不了架构师&#xff1f;>>> 养成使用utf8格式的习惯&#xff0c;但是不能保证所有的代码都是utf8格式&#xff0c;所以这里提供三个函数 getCoding tran2UTF8 tran2GBK &#xff0c;分别是查看编码格式&#xff0c;转换为utf8&#xff0c;gbk格…

计算机二级中制作流程图的视频教程,流程图怎么做?1分钟教会你流程图制作方法...

流程是指在特定情景下用一系列逻辑满足特定用户需求的一种总结&#xff0c;借助流程图不仅可以梳理产品需求背后的逻辑和流程&#xff0c;还可以将新的想法和概念借助流程图这个载体分享出来&#xff0c;让整个项目参与者更好的认知产品设计的思路和逻辑。为了让职场的你更好的…

Source Generators实现简版AutoMapper

问题在业务开发中&#xff0c;我们常常需要将一个对象映射成另一个对象。例如将领域实体(UserEntity)映射成暴露给服务外部使用的数据传输对象(UserDto)。而AutoMapper则是目前主流的解决方案&#xff0c;实现类似如下代码&#xff1a;var configuration new MapperConfigurat…

15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界

全世界只有3.14 %的人关注了青少年数学之旅从文明之火初燃的那一刻起数学就与之为伴从万年前“数”的产生到现代科技的迅猛发展数学不仅是窥探宇宙万物的入口也是最高智慧的结晶在漫漫的人类历史长河中各个伟大的数学家犹如布满“数学星空”中的星群他们追求最高的精确最合理的…

Java程序员应该知道的10个Eclipse调试技巧

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse是众多Java程序员实用的开发工具&#xff0c;其中开发技巧也是繁多&#xff0c;但作为优秀的Java程序员&#xff0c;需要掌握最起码的调试技巧。 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 6…

.NET 平台采用率的提升归功于开源

微软近日发布了一篇博客&#xff0c;以对话形式与 .NET 工程师探讨了一下有关 .NET 项目的开源经验和心得。其中指出&#xff0c;.NET 软件开发平台采用率的提升主要归功于开源。根据介绍&#xff0c;微软在 2015 年将其 CoreCLR .NET 执行引擎作为开源发布&#xff0c;并在 20…

新世纪英汉词典 | 今日最佳

全世界只有3.14 %的人关注了青少年数学之旅&#xff08;图源 荷兰鸭&#xff0c;侵权删&#xff09;

发布一个biztalk 解析Excel文件到xml消息的管道组件

<?xml:namespace prefix o /><?xml:namespace prefix v /> 此pipeline component主要功能是通过ODBC的excel驱动把excel文件转成xml的消息。excel文件可以是biztalk通过从各种适配器获得&#xff0c;比如从file、ftp、msmq、http等等适配器获得excel文件的数…

点歌软件测试自学,实际歌唱对比测试

四、实际歌唱对比测试光说不练假把戏&#xff0c;卡拉OK软件真正PK还是在实唱方面。所以我们现在就来测试一下这四款软件在真人真唱方面表现的到底怎么样。四款软件在点唱歌曲时都需要在线下载&#xff0c;经过测试&#xff0c;在普通ADSL(1M带宽)的环境下歌曲加载速度都不慢&a…

不懂物理,何以谈科技?

全世界只有3.14 % 的人关注了青少年数学之旅孩子对这个世界有着最纯粹的好奇&#xff0c;经常会问许许多多他们在日常生活中遇到的种种问题。天空为什么是蓝色的&#xff1f;电是怎么来的&#xff1f;为什么不管怎么使劲儿蹦&#xff0c;还是会落到地上&#xff1f;像小木的表妹…