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 相关文章推荐
Javascript 类与静态类的实现
Apr 01 Javascript
Jquery选中或取消radio示例
Sep 29 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
Jun 08 Javascript
JS前端笔试题分析
Dec 19 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
js实现文本上下来回滚动
Feb 03 Javascript
Node.js 8 中的 util.promisify的详解
Jun 12 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
Aug 09 Javascript
微信小程序实现折叠面板
Jan 31 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP 文件上传全攻略
2010/04/28 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
Python制作CSDN免积分下载器
2015/03/10 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
pandas DataFrame运算的实现
2020/06/14 Python
Python 代码调试技巧示例代码
2020/08/11 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
铲车司机岗位职责
2014/03/15 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
团队队名口号大全
2014/06/06 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
欠条范文
2015/07/03 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python