【导读】嗯,偶尔看看学习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来绑定事件实现

Vue 2升级 Vue 3初探小细节相关推荐

  1. 创建vue项目(四)路由相关知识、路由守卫、插槽、打包小细节

    一.路由相关点 1. 路由跳转传参以及接参 https://segmentfault.com/a/1190000012393587 方法一: (1) 参数配置: { path : 'xx/:参数变量' ...

  2. 记一次Vue框架升级

    框架升级背景 公司目前业务迭代很快,且大部分的流量都在公众号上.然而我们公众号所使用的框架却是3年前的Vue 1.0.16.面对Vue这3年来带来的无数新特性,我们只能望洋兴叹:看得见,摸不着,因为升 ...

  3. vue 安装 less_解决旧Vue项目升级less-loader 6.0.0报错

    作为一个爱折腾的主,我的package随时都是ncu -u! 何为ncu,就是检查nodejs npm/yarn项目依赖最新版本package.json一个插件! 这不,前几天less-loader ...

  4. typescript vuex_将已有的Vue项目升级支持TypeScript

    TypeScript是js的超集,是由微软开发的.越来越多的项目使用TypeScript.像现在很火的Visual Studio Code就是使用TypeScript开发. 本人开发过一段Angula ...

  5. vue全家桶开发的一些小技巧和注意事项

    作者:沉末_ https://juejin.im/user/5b7c1be9e51d4538b35bfc32 前言 用vue全家桶开发一年多了,踩过不少坑,也解决了很多的问题,把其中的一些点记录下来, ...

  6. 如何升级Vue的版本 vue2.9.6升级到vue3.0

    背景:电脑使用多年,一直使用vue 2.x版本,项目开发过程中由于一个模块涉及的集成模块过多,导致需要进行定义的变量越来越多,代码出现冗余,因此在同事的推动下,鉴于vue 3.x的优化,故对自己本来使 ...

  7. 公司项目vue cli2升级到vue cli3

    背景: 公司项目历时时间较长,通过长时间的迭代,目前项目文件较多(src目录下有2217个文件),系统庞大, 之前通过vue cli2脚手架构建的项目框架,在本地开发时已经明显感觉到吃力(项目首次启动 ...

  8. vue拖拽实现app或小程序装修界面

    vue拖拽实现app或小程序装修 一.最终效果图 参考引用作者:作者:李白不吃茶v 原作者源代码git地址:大神的源代码 这里是引用 二.需要安装的依赖 安装:vuedraggable 语法:npm ...

  9. vue项目升级(01):全面解析vuecil3/vuecil4的vue.config.js等常用配置

    前言 前端变化日新月异,层出不穷,公司原项目使用vuecil2版本开发,elementUI等一系列库版本太低,也脱离世界很久远了,新版本库需要webpack4等环境,而老版本配置起来bug很多,在使用 ...

最新文章

  1. mysql中的枚举enum_mysql中枚举类型之enum详解
  2. linux下的ps aux | grep -c php-fpm 与netstat -napo |grep php-fpm | wc -l 命令
  3. Delphi:ClientDataset+TDataSetProvider的数据保存问题
  4. linux不保存退出命令_面试提问说出16个linux命令,能凑齐不!高频22个Linux命令在这里...
  5. python中df去重_Python中DataFrame去重
  6. matlab两个图共用一个x轴_Matlab Figures (3) —— 叠加作图与多坐标轴
  7. Chia如何提高P盘速度
  8. 酷盘API C# 测试版
  9. macOS下JetBrains配置修改错误导致无法启动解决方案
  10. 我的javascript学习笔记之数据类型
  11. 2020年中级数据库系统工程师考试时间表与考试大纲
  12. putty安装和使用
  13. 永洪bi_永洪bi相关优惠价格-永洪bi的技术博客问答-阿里云
  14. 云计算就业薪资怎么样 如何加入云计算行列
  15. View是什么,什么是View?
  16. 前后落差大用什么词语_形容前后反差大的词语
  17. 注册小程序需要营业执照吗?
  18. 行业网站十年改变了什么 电商网 -《电子商务世界》打造电子商务大社区
  19. 求3000以内的亲密数C语言
  20. Mybatis Generator逆向工程的使用

热门文章

  1. 数据分析和数据挖掘的理论研究必要性
  2. J2EE第五课Servlet随课笔记
  3. 发布一个博客园专用Windows Live Writer代码插件
  4. Chrome OS 云里雾里
  5. 大型网站技术架构:核心原理与案例分析笔记
  6. vi 编辑器跳转到指定行数
  7. 转载:Pixhawk源码笔记一:APM代码基本结构
  8. [转]Myeclipse9引入easy_ui时,其中的部分js文件报错
  9. 经验总结03-dwr
  10. sqlserver2008 创建支持文件流的数据库