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 相关文章推荐
弹出广告特效代码(一个IP只弹出一次)
May 11 Javascript
js checkbox(复选框) 使用集锦
Apr 28 Javascript
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
js截取中英文字符串、标点符号无乱码示例解读
Apr 17 Javascript
一个简单的jquery进度条示例
Apr 28 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
Aug 14 Javascript
跨域资源共享 CORS 详解
Apr 26 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
总结几道关于Node.js的面试问题
Jan 11 Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 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
php中用文本文件做数据库的实现方法
2008/03/27 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
中止javascript执行的方法
2014/02/14 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
浅析vue深复制
2018/01/29 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
Python学习笔记_数据排序方法
2014/05/22 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
python 字符串追加实例
2019/07/20 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
为什么需要版本控制?
2013/08/08 面试题
演讲比赛获奖感言
2014/02/02 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python