Vue封装的可编辑表格插件方法


Posted in Javascript onAugust 28, 2018

可任意合并表头,实现单元格编辑。

页面效果如图:

Vue封装的可编辑表格插件方法

页面使用如下:

<template>
 <div>
  <v-table 
   :datat = "tableData" 
   :thlabel="thlabel"
   :isEdit="true">
  </v-table>
 </div>
</template>

<script>
 export default{
  data(){
   return{
    tableData:[{'a':'1','b':'2','c':'3','d':'8'},{'a':'4','b':'5',c:'6',d:'9'}],
    thlabel:[[{label:'测试1',prop:'a',rowspan:'2'},{label:'测试2'},{label:'测试3',colspan:'2'}],
      [{prop:'c',label:'表头2'},{prop:'b',label:'表头3'},{prop:'d',label:'表头4'}]]
   }
  }
 }
</script>

目录结构如下:

Vue封装的可编辑表格插件方法

vtable.vue代码如下:

<template id="vtable"> 
 <table>
  <thead>
   <tr v-for="(i,index) in rownum">
    <th v-for="label in thlabel[index]">{{label.label}}</th>
   </tr>
  </thead>
  <tbody>
   <tr v-for="data in datat">
    <td v-for="key in labelprop" @click="tdEdit($event)"><input type="text" v-model="data[key]"/></td>
   </tr>
  </tbody>
 </table>
</template>

<script>
 export default{
  props:{
   datat:{
    type:Array,
    required:true
   }, 
   thlabel:{//表头数组
    type:Array,
    required:true
   },
   isEdit:{
    type:Boolean,
    required:true
   }
  },
  data(){
   return{
    datata:''
   }
  },
  computed:{
   rownum:function(){//表头行数
    return this.thlabel.length;
   },
   labelprop:function(){//取出表头数据依次对应的字段key
    let thlab = this.thlabel;
    var ar = [];
    for(let i=0;i<thlab.length;i++)
     for(let j=0;j<thlab[i].length;j++){
      for(var key in thlab[i][j]){
       if(key == 'prop'){
        ar.push(thlab[i][j][key])
       }
      }
     }
    return ar;
   },
  },
  mounted:function(){
   this.$nextTick(function(){
    $('td').attr('isEdit',this.isEdit);
    var a = this.thlabel;
    for(let i=0;i<a.length;i++)
     for(let j=0;j<a[i].length;j++){
      for(var key in a[i][j]){
       if(key == 'rowspan'){
        $($('tr').eq(i).find('th').eq(j)).attr('rowspan',a[i][j][key]);
       }else if(key == 'colspan'){
        $($('tr').eq(i).find('th').eq(j)).attr('colspan',a[i][j][key]);
       }
      }
     }
    }
   )
  },
  methods:{
   tdEdit:function(event){
    var h = event.currentTarget;
    if($(h).attr('isEdit')){
     $(h).find('input').attr("readOnly",false);
     $(h).addClass('tdclick').siblings().removeClass('tdclick');
     $(h).addClass('tdclick').parent('tr').siblings().find('td').removeClass('tdclick');
    }else{
     $(h).find('input').attr("readOnly",true);
    }
   }
  } 
 }
</script>

<style>
@import './scss/vtable.css';
</style>

index.js代码如下:

import Vue from 'vue'
import vtable from './vtable/vtable.vue'
import vpagination from './vpagination/vpagination.vue'
const common = {//全局安装
 install:function(Vue){
  Vue.component('vTable',vtable);
  Vue.component('vPag',vpagination);
 }
}
export default common

main.js中引入

import common from './components/common/index.js'
Vue.use(common)

css样式代码:

table {
 border: 1px solid #EBEEF5;
 height: 200px;
 width: 300px;
 text-align: center;
 margin-left: 40px; }
 table td {
 border: 1px solid #EBEEF5;
 position: relative;
 color: #606266; }
 table th {
 text-align: center;
 border: 1px solid #EBEEF5;
 background-color: #F5F7FA;
 color: #909D8F;
 line-height: 60px; }

tr:hover {
 background-color: #F6F8FB; }
.tdclick:after{
 content: ' ';
 position: absolute;
 display: block;
 width: 100%;
 height: 100%;
 top: 0;
 left: 0;
 border: 1px solid blue;
 pointer-events: none;
}
input{
 display: block;
 width: 100%;
 height: 100%;
 text-align: center;
 border: none;
 outline: none;
}
/*# sourceMappingURL=vtable.css.map */

如有错误或可改进的地方,请指正!

以上这篇Vue封装的可编辑表格插件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
多个iframe自动调整大小的问题
Sep 18 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
jquery实现点击页面计算点击次数
Jan 23 Javascript
AngularJS 实现按需异步加载实例代码
Oct 18 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
Jun 11 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
Vue不能检测到Object/Array更新的情况的解决
Jun 26 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
Aug 28 #Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
Aug 28 #Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 #Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 #Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
Aug 28 #Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 #Javascript
vue移动端微信授权登录插件封装的实例
Aug 28 #Javascript
You might like
用来解析.htgroup文件的PHP类
2012/09/05 PHP
php创建图像具体步骤
2017/03/13 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python 性能优化方法小结
2017/03/31 Python
python实现简易动态时钟
2018/11/19 Python
Python:slice与indices的用法
2019/11/25 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
C语言编程题
2015/03/09 面试题
模具专业毕业生自荐书范文
2014/02/19 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
产品售后服务承诺书
2014/05/21 职场文书
冬季安全检查方案
2014/05/23 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
见习报告怎么写
2014/10/31 职场文书
大学生社会实践感想
2015/08/11 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
思想品德课教学反思
2016/02/24 职场文书
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL