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个数学家》他是一位浪漫的法国人&#…

男人说谎白皮书

谎言——幸福的润滑剂 你对她说过谎吗&#xff1f;我想&#xff0c;即使你和她是最深爱的一对&#xff0c;你也不敢轻易地摇头说你没有&#xff01;但并不是说两个人在一起生活&#xff0c;彼此之间就会充满谎言&#xff0c;就像梁静茹在《花园》里唱的一样&#xff1a;“谎言&…

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

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

vue自定义html布局,vue的自定义布局(vm/vh)

目录1. px与视口2. %3. 媒体查询4. rem5. vm/vh1. vw/vh的定义css3中引入了一个新的单位vw/vh&#xff0c;与视图窗口有关&#xff0c;vw表示相对于视图窗口的宽度&#xff0c;vh表示相对于视图窗口高度&#xff0c;除了vw和vh外&#xff0c;还有vmin和vmax两个相关的单位。各个…

Memcached 缓存个体,对象,泛型,表

最近&#xff0c;为提高数据查询速度&#xff0c;想做点缓存&#xff0c;通过网上了解&#xff0c;觉得&#xff0c;最好使用的就是Memcached&#xff1b;下面简单给大家介绍下Memcached&#xff1b; 下面是两位大牛关于Memcached的介绍&#xff1b;大家可以看看 http://zhoufo…

C# 语言特性

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

北方人的快乐。。。| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;视频来源 最走心的视频&#xff0c;侵权删&#xff09;

游国色天香中国馆有感

游国色天香中国馆有感——代腾飞 2007年9月16日 于成都漫步花丛望楼亭湖上泛舟烟雨行中国山河多绣丽怎叫诗人不生情

微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库

1、办公自动化是计算机的一项应用&#xff0c;按计算机应用的分类&#xff0c;它属于( C )A、科学计算 B、实时控制 C、数据处理 D、辅助设计2、计算机最主要的工作特点是( A )A、程序存储与自动控制 B、高速度与高精度C、可靠性与可用性 D、有记忆能力3、一般情况下&#xff0…

如何掌握C#的核心技术

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

Zend_Feed 的项目实际应用

author songfengRSS0.9/1.0/2.0 ATOM 全部是内容聚合的应用&#xff0c;优点一是浏览者可以订阅其网站&#xff0c;能收到最新的网站更新内容&#xff0e;二是有利于搜索引擎抓取&#xff0e;个人感觉缺点是会被其它网站当成复制品&#xff0c;批量 抓取网站更新内容&…

mysqldump 的常用参数。

mysqldump 常用参数详解&#xff1a;--databases&#xff1a;备份多个数据库&#xff0c;选项后跟多个库名。备份文件中会包含USE db_name。--events : 备份事件--routines&#xff1a;备份存储过程和函数--ignore-tableTableName :指定不需要备份的表--tables&#xff1a;…

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

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

西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...

原西北纺织工学院&#xff0c;曾更名为西安工程科技学院&#xff0c;2006年2月更名为西安工程大学。西北纺织工学院位于世界闻名的历史文化古都西安市&#xff0c;是中国纺织总会直属高等院校&#xff0c;也是我国西北和西南地区唯一的一所纺织高等学府&#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格…