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之旅 对象的原型链之由来
Aug 25 Javascript
JQuery操作单选按钮以及复选按钮示例
Sep 23 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
JS中常用的输出方式(五种)
Jun 12 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
vue修改vue项目运行端口号的方法
Aug 04 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
Mar 06 Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 Javascript
微信小程序onShareTimeline()实现分享朋友圈
Jan 07 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
微信小程序如何获取手机验证码
2018/11/04 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
python不带重复的全排列代码
2013/08/13 Python
python类继承用法实例分析
2015/05/27 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
对Python w和w+权限的区别详解
2019/01/23 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
python 实现任务管理清单案例
2020/04/25 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
建设工地安全标语
2014/06/07 职场文书
普通话宣传标语
2014/06/26 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
技术负责人岗位职责
2015/02/10 职场文书
导游词之崇武古城
2019/10/07 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL