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 相关文章推荐
JQuery中html()方法使用不当带来的陷阱
Apr 07 Javascript
JQuery获取文本框中字符长度的代码
Sep 29 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
Jan 31 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
在JS循环中使用async/await的方法
Oct 12 Javascript
Vue.js实现备忘录功能
Jun 26 Javascript
AngularJS动态生成select下拉框的方法实例
Nov 17 Javascript
JS函数本身的作用域实例分析
Mar 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
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
常用jQuery代码分享
2015/07/14 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
实例讲解React 组件生命周期
2020/07/08 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
跟老齐学Python之list和str比较
2014/09/20 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
历史学专业求职信
2014/06/19 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
上课说话检讨书
2015/01/27 职场文书
道歉的话语大全
2015/05/12 职场文书
食品卫生管理制度
2015/08/06 职场文书
2016年记者节感言
2015/12/08 职场文书