经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue+element实现表格新增、编辑、删除功能
来源:jb51  时间:2019/5/29 8:36:02  对本文有异议

需要做一个需求:新增一个xml文件时,添加数量不确定、属性相同的xml标签,想了想可以用表格做啊,属性相同,使用统一的表头,下面的属性值只是进行增删改不就行了,就类似于mysql给表里填数据一样。

可是目前似乎还没有表格的直接增删改一行的操作,那要怎么实现呢?于是,通过上网以及自己的思考,终于实现了,代码、思路以及效果图如下:

1 html部分:

  1. <el-button type="success" @click="addRow(tableData)">新增</el-button>
  2. <template>
  3. <el-table
  4. :data="tableData"
  5. style="width: 100%"
  6. max-height="250"
  7. @cell-dblclick="tableDbEdit">
  8. <el-table-column
  9. prop="name"
  10. label="name"
  11. width="150">
  12. </el-table-column>
  13. <el-table-column
  14. prop="xpath"
  15. label="xpath"
  16. width="120">
  17. </el-table-column>
  18. <el-table-column
  19. prop="desc"
  20. label="desc"
  21. width="120">
  22. </el-table-column>
  23. <el-table-column
  24. prop="value"
  25. label="value"
  26. width="120">
  27. </el-table-column>
  28. <el-table-column
  29. prop="defVal"
  30. label="defVal"
  31. width="300">
  32. </el-table-column>
  33. <el-table-column
  34. fixed="right"
  35. label="操作"
  36. width="120">
  37. <template slot-scope="scope">
  38. <el-button
  39. @click.native.prevent="deleteRow(scope.$index, tableData)"
  40. type="text"
  41. size="small">
  42. 移除
  43. </el-button>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. </template>

2 样式部分

  1. <style>
  2. .el-table .warning-row {
  3. background: oldlace;
  4. }
  5. .el-table .success-row {
  6. background: #f0f9eb;
  7. }
  8. .cell-edit-color{
  9. color:#2db7f5;
  10. font-weight: bold;
  11. }
  12. .cell-edit-input .el-input, .el-input__inner {
  13. width:100px;
  14. }
  15. .cell-icon{
  16. cursor:pointer;
  17. color:#fff;
  18. }
  19. </style>

3.data定义:

  1. rules: {
  2. fileName: [
  3. { required: true, message: '请输入文件路径', trigger: 'blur' }
  4. ],
  5. policyfileName: [
  6. { required: true, message: '请输入文件路径', trigger: 'blur' }
  7. ],
  8. parmna: [
  9. { required: true, message: '请输入数据字段名称', trigger: 'blur' }
  10. ],
  11. remark: [
  12. { required: true, message: '请输入分组类型名称', trigger: 'blur' }
  13. ]
  14. },
  15. activeName: 'include',
  16. tabPosition: 'left',
  17. dialogFormVisible: false,
  18. formQuery:[],
  19. serverForm: {
  20. fileName: '',
  21. policyfileName: '',//policy下的include
  22. scmType: '',
  23. version: '',
  24. address: ''
  25. },
  26. tableData: [{
  27. name: 'aa',
  28. xpath: 'bb',
  29. desc: 'cc',
  30. value: 'dd',
  31. defVal: 'ee'
  32. }, {
  33. name: 'aa1',
  34. xpath: 'bb1',
  35. desc: 'cc1',
  36. value: 'dd1',
  37. defVal: 'ee1'
  38. }]

4 具体方法:

  1. deleteRow(index, rows) {//移除一行
  2. rows.splice(index, 1);//删掉该行
  3. },
  4. addRow(tableData,event){//新增一行
  5. //之前一直想不到怎么新增一行空数据,最后幸亏一位朋友提示:表格新增一行,其实就是源数据的新增,从源数据入手就可以实现了,于是 恍然大悟啊!
  6. tableData.push({ name: '', xpath: '',desc:'',value:'',defVal:'' })
  7. },
  8.  
  9. tableDbEdit(row, column, cell, event) {//编辑单元格数据
  10. //当鼠标双击单元格里面具体单元格的时候,即可对数据进行编辑操作,其实就是添加了一个输入框,最终将输入框中的数据保存下来就行了。
  11. event.target.innerHTML = "";
  12. let cellInput = document.createElement("input");
  13. cellInput.value = "";
  14. cellInput.setAttribute("type", "text");
  15. cellInput.style.width = "60%";
  16. cell.appendChild(cellInput);
  17. cellInput.onblur = function() {
  18. cell.removeChild(cellInput);
  19. event.target.innerHTML = cellInput.value;
  20. };
  21. }

效果如下

————————分割线———————–

之前实现的都是input框的方式,昨天又做了个优化,增加了下拉框的方式,并且新增了提交表单时,能够将数据传到后端的功能。

首先我们知道,select标签的格式,比较特殊,没有input那么直接,每次只需要修改,展示它本身的value属性的值就OK了,select的标签格式如下:

  1. <select>
  2. <option value="volvo">Volvo</option>
  3. <option value="saab">Saab</option>
  4. <option value="mercedes">Mercedes</option>
  5. <option value="audi">Audi</option>
  6. </select>

那么, 我的修改之后的编辑方法如下:

  1. tableDbEdit(row, column, cell, event) {
  2. event.target.innerHTML = "";
  3. let cellInput = '';
  4. let name = column.property.trim();//拿到当前的属性值
  5. //新建一个option元素
  6. let option = document.createElement('option')
  7. let option2 = document.createElement('option')
  8. if(name==="fildtp"){
  9. cellInput = document.createElement("select");
  10. //为option赋值和内容
  11. option.value="1";
  12. option.text="字符";
  13. option2.value="2";
  14. option2.text="数字";
  15. //将option元素直接添加为子元素
  16. cellInput.appendChild(option);
  17. cellInput.appendChild(option2);
  18. cell.appendChild(cellInput);
  19. cellInput.onblur = function() {
  20. cell.removeChild(cellInput);
  21. //将单元格的内容填充为所选中元素的内容,而不是值
  22. event.target.innerHTML = cellInput.selectedOptions[0].text;
  23. //将所选中元素的值赋给该行的值,每个属性都执行一次赋值,那么在最终提交表单的时候,就能保证当前表的值传到后端
  24. row.fildtp=cellInput.value;
  25. }
  26. }else if(name==="musttg"){
  27. cellInput = document.createElement("select");
  28. option.value="1";
  29. option.text="是";
  30. option2.value="0";
  31. option2.text="否";
  32. cellInput.appendChild(option);
  33. cellInput.appendChild(option2);
  34. cell.appendChild(cellInput);
  35. cellInput.onblur = function() {
  36. cell.removeChild(cellInput);
  37. event.target.innerHTML = cellInput.selectedOptions[0].text;
  38. row.musttg=cellInput.value;
  39. }
  40. }else if(name==="looptg"){
  41. cellInput = document.createElement("select");
  42. option.value="1";
  43. option.text="循环";
  44. option2.value="0";
  45. option2.text="非循环";
  46. cellInput.appendChild(option);
  47. cellInput.appendChild(option2);
  48. cell.appendChild(cellInput);
  49. cellInput.onblur = function() {
  50. cell.removeChild(cellInput);
  51. event.target.innerHTML = cellInput.selectedOptions[0].text;
  52. row.looptg=cellInput.value;
  53. };
  54. }else{
  55. debugger
  56. cellInput = document.createElement("input");
  57. cellInput.value = "";
  58. cellInput.setAttribute("type", "text");
  59. cellInput.style.width = "75%";
  60. cell.appendChild(cellInput);
  61. cellInput.onblur = function() {
  62. cell.removeChild(cellInput);
  63. event.target.innerHTML = cellInput.value;
  64. if(name==="fildcd"){
  65. row.fildcd=cellInput.value;
  66. }else if(name==="fildna"){
  67. row.fildna=cellInput.value;
  68. }else if(name==="fildln"){
  69. row.fildln=cellInput.value;
  70. }else if(name==="fildde"){
  71. row.fildde=cellInput.value;
  72. }else if(name==="defult"){
  73. row.defult=cellInput.value;
  74. }else if(name==="format"){
  75. row.format=cellInput.value;
  76. }else if(name==="enumcd"){
  77. row.enumcd=cellInput.value;
  78. }else if(name==="loophd"){
  79. row.loophd=cellInput.value;
  80. }else if(name==="remark"){
  81. row.remark=cellInput.value;
  82. }
  83. };
  84. }
  85. },

这种方式,比较详细,也比较容易理解,但是总感觉有点不完美,首先新增了一行以后,必须要双击某一个单元格参能进行内容的输入,不够明显。从代码上来说,代码量也较大;而且使用的是原生的html标签,因此,我在之后对此进行了一个优化,直接使用vue的代码实现,不仅大大减少了代码量,还实现了操作的友好性。具体实现可以查看的我的文章:Vue+Element实现表格的编辑、删除、以及新增行的最优方法

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号