vue实现表格数据的增删改查


Posted in Javascript onJuly 10, 2017

在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作。比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改。在vue中,我们更应该专注于对数据的操作和处理。

比如我们有一个这样的页面:

vue实现表格数据的增删改查

我们在这个页面里,就实现了增删改查4个功能,点击链接查看demo【http://www.xiabingbao.com/demo/vue-curd/index.html】。

我们把这些用户信息保存到list的数组中,然后增删改查就在这个数组上进行:

list: [
 {
 username: 'aaaaa',
 email: '123@qq.com',
 sex: '男',
 province: '北京市',
 hobby: ['篮球', '读书', '编程']
 },
 {
 username: 'bbbbb',
 email: 'bbbbbbb@163.com',
 sex: '女',
 province: '河北省',
 hobby: ['弹琴', '读书', '插画']
 }
 // ...
]

设置这些数据主要也是复习一下vue对表单的处理操作,这里面的表单有:文本输入框,单选按钮,select选择框,复选框等。

1. 展示数据

我们的数据都放在数组list中,但是这里并不直接对list对循环输出,而是先把list中的数据给一个数组slist,对slist进行循环输出。因为我们在后面的查询功能中需要对数据进行过滤,数组list一直保存着原始数据(包括新增、修改后或已删除后),而数组slist只负责展示。

在vue中提供一个setSlist方法,将需要展示的数据给了数组slist:

// 获取需要渲染到页面中的数据
setSlist(arr) {
 this.slist = JSON.parse(JSON.stringify(arr));
}

然后在html中使用v-for把slist数组渲染出来:

<tr v-cloak v-for="(item, index) of slist">
 <td>{{index+1}}</td>
 <td>{{item.username}}</td>
 <td>{{item.email}}</td>
 <td>{{item.sex}}</td>
 <td>{{item.province}}</td>
 <td>{{item.hobby.join(' | ')}}</td>
 <td><a href="javascript:;" @click="showOverlay(index)">修改</a> | <a href="javascript:;" @click="del(index)">删除</a></td>
</tr>

在操作这一栏中,给修改和删除操作绑定上事件。

2. 增加和删除功能

把增加功能和删除合并到一起,是这两个功能相对来说都比较简单。
增加用户时使用push方法,把用户的信息添加到list数组的最后:

this.list.push({
 username: 'ffff',
 email: 'fffffff@163.com',
 sex: '女',
 province: '河南省',
 hobby: ['弹琴', '插画']
});

这样就能添加一位ffff的用户了。
删除用户时,通过splice(index, 1),可以删除index位置的数据,页面上的数据自动就会更新。

3. 修改功能

当我们想要修改某个元素时,可以把这个位置上的数据取出来放到弹层里(或者其他某个位置),在弹层里的信息可以取消或者修改后进行保存。
假设我们弹层里的数据是selectedlist,那么每次修改时,把index位置的数据给了selectedlist,然后在弹层中修改selectedlist。我们也能看到修改数据的类型: 文本框(用户名,邮箱),单选按钮(性别),select选择框(所在省份),多选框(爱好),这里我们主要练习的是表单处理(https://cn.vuejs.org/v2/guide/forms.html)。弹层是否显示用变量isActive来控制:

// 修改数据
modifyData(index) {
 this.selected = index; // 修改的位置
 this.selectedlist = this.list[index];
 this.isActive = true;
}

有没有发现一个问题,当修改弹层中的信息时,表格中的数据也同步更新了。可是我们本身是希望当点击保存按钮时,才把弹层中的数据保存到表格里。问题的根源就出在这里:

this.selectedlist = this.list[index];

因为list[index]是个Object类型的数据,若使用=赋值,则赋值操作为浅度拷贝(把数据的地址赋值给对应变量,而没有把具体的数据复制给变量,变量会随数据值的变化而变化),selectedlist与list[index]使用相同的数据地址,互相引起数据值的变化。因此这里我们需要进行深度拷贝:

this.selectedlist = JSON.parse( JSON.stringify(this.list[index]) ); // 先转换为字符串,然后再转换

当用户修改数据后,selectedlist就会发生变化,点击保存按钮时,将数据重新保存到index位置:

/*
 this.list 数据数组
 this.selected 刚才修改的位置
 this.selectedlist 需要保存的数据
*/
Vue.set(this.list, this.selected, this.selectedlist);

4. 查询功能

在第1小节中我们已经说过,在页面表格中展示的是slist中的数据,就是为了方便执行查询操作:

// 获取需要渲染到页面中的数据
setSlist(arr) {
 this.slist = JSON.parse(JSON.stringify(arr));
}

每次根据某些条件将过滤后的数据赋值给slist数组,展示出查询后的数据。这里我们的查询实现了两个小功能:

1.用户在输入某个字符后,自动在输入框下方用列表展示出用户可能要查询的词语(如用户名等)
2.同步更新表格中的数据

这里我们通过用户名和邮箱进行查询,因此在过滤数据时,需要检测用户名和邮箱是否含有查询的单词。我们先给输入框绑定一个input事件,同时用datalist展示用户可能要查询的词语:

<input type="text" placeholder="search" @input="search" list="cars" class="search">
<datalist id="cars">
 <option v-for="item in searchlist" :value="item"></option>
</datalist>

search功能的实现,searchlist为在输入框下方展示的可能要搜索的词语,ss数组则保存过滤后的数据,当循环完毕后,设置调用setSlist方法修改slist数组:

// 搜索
search(e) {
 var v = e.target.value,
 self = this;
 self.searchlist = [];
 if (v) {
 var ss = [];

 // 过滤需要的数据
 this.list.forEach(function (item) {
  // 检测用户名
  if (item.username.indexOf(v) > -1) {
  if (self.searchlist.indexOf(item.username) == -1) {
   self.searchlist.push(item.username);
  }
  ss.push(item);
  } else if (item.email.indexOf(v) > -1) {
  // 检测邮箱
  if (self.searchlist.indexOf(item.email) == -1) {
   self.searchlist.push(item.email);
  }
  ss.push(item);
  }
 });
 this.setSlist(ss); // 将过滤后的数据给了slist
 } else {
 // 没有搜索内容,则展示全部数据
 this.setSlist(this.list);
 }
}

每当用户输入或者删除一个字符时都会调用search方法,执行查询操作,当用点击展示词语列表时,也会调用search方法。

5. 将弹层独立为组件

其实我们应该发现,修改功能(或新增功能)从代码和样式上相对来说比较独立,我们把弹层独立为组件的形式,把需要修改的数据通过props传递给该组件(新增数据时,可以给组件传递一个空数据),当用户点击保存时,再通过$emit给了父组件(子组件不能直接父级的数据,需要用data或者computed生成一个局部变量,然后再使用$emit方法把这个局部数据再传递上去):

// 弹层组件 
Vue.component('model', {
 props: ['list', 'isactive'],
 template: `<div class="overlay" v-show="isactive">
   <div class="con">
   <h2 class="title">新增 | 修改</h2>
   <div class="content">
    /* 省略 */
   </div>
   </div>
  </div>`,
 computed: {
 modifylist() {
  return this.list;
 }
 },
 methods: {
 changeActive() {
  this.$emit('change'); // 关闭弹层,修改isactive值
 },
 modify() {
  this.$emit('modify', this.modifylist); // 将修改后的数据传递给父组件
 }
 }
});

父组件,在父组件中截取change和modify事件,再用changeOverlay和modify来实现:

<model :list='selectedlist' :isactive="isActive" v-cloak @change="changeOverlay" @modify="modify"></model>

6. 总结

洋洋洒洒写了不少,其实里面的难点不太多,主要是form表单方面的操作,再一个就是练习下组件间的数据与事件传递。内容比较简单,欢迎各位批评指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 Javascript
javascript日期转换 时间戳转日期格式
Nov 05 Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
JQuery触发事件例如click
Sep 11 Javascript
json定义及jquery操作json的方法
Oct 03 Javascript
详解Angular 4.x Injector
May 04 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
May 12 Javascript
微信小程序多列选择器range-key使用详解
Mar 30 Javascript
浅谈react前后端同构渲染
Sep 20 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
Sep 10 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 #Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
Jul 10 #Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 #jQuery
Underscore之Array_动力节点Java学院整理
Jul 10 #Javascript
Angular.js ng-file-upload结合springMVC的使用教程
Jul 10 #Javascript
underscore之Collections_动力节点Java学院整理
Jul 10 #Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 #Javascript
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
js中数组Array的一些常用方法总结
2013/08/12 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript函数详解
2015/02/27 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
pygame学习笔记(4):声音控制
2015/04/15 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python右对齐的实例方法
2020/07/05 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
教育局长自荐信范文
2013/12/22 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
投标授权委托书范文
2014/08/02 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
管辖权异议上诉状
2015/05/23 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
nginx设置资源请求目录的方式详解
2022/05/30 Servers