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 相关文章推荐
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
May 17 Javascript
alert和confirm功能介绍
May 21 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
Jan 28 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
Mar 01 Javascript
详解tween.js的使用教程
Sep 14 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
微信小程序中进行地图导航功能的实现方法
Jun 29 Javascript
4个顶级开源JavaScript图表库
Sep 29 Javascript
JS/jQuery实现简单的开关灯效果【案例】
Feb 19 jQuery
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 Javascript
小程序实现密码输入框
Nov 16 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
理解Python垃圾回收机制
2016/02/12 Python
Python yield与实现方法代码分析
2018/02/06 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python 字典中取值的两种方法小结
2018/08/02 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
想学python 这5本书籍你必看!
2018/12/11 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
一套中级Java程序员笔试题
2015/01/14 面试题
记者岗位职责
2014/01/06 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
电力培训心得体会
2014/09/02 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书