handsontable的二次封装

介绍

基于vue-handsontable的二次封装。

在线编辑表格组件中,handsontable功能强大,而且有免费版,但是英文版技术文档和外网官网让人一言难尽。本次封装基于vue-handsontable的二次封装(根据handsontable的属性制作简单快捷功能,如固定表头,字段显隐,合并表格。

码云地址:https://gitee.com/yiforget/vue-encapsulation-handsontable

gitHub地址:https://github.com/yi1104647079/vue-encapsulation-handsontable

效果图

case2.png

Gif较大,请稍等

gifhome_1600x780_21s.gif

功能简介

1.固定表头

  • handsontable中规定组件父元素height必须为准确值,但是数据为动态时高度无法确定。

  • 当数据数据过多时候,滚动条出现,下滑时表头无法查看,查阅起来很不方便。

    本功能可设置一个默认高度,为400px,当数据过多,滚动条出现。也可默认不固定表头,则handsontable的父元素高度为数据量计算而来,实现动态高度

2.字段显隐

顾名思义,可将表头字段隐藏或者显示

3.合并表格

handsontable的属性mergeCells可以进行表格合并,但需按照特定规则将所需要合并的单元格位置已数组形式存储。

[
    {row:0, col:2, rowspan:5, colspan:1},
    {row:0, col:5, rowspan:6, colspan:1},
]

当数据为调取后端时候,需要动态的计算出合并位置。所以根据此属性需要将数据重组成以下类型,才可合并。

//所需要合并的字段必须每一个的都需要有值,可能需要个人的数据处理
[
    {typeName: '测试1', name: '名称1', targetMoney:'10', actualMoney: '20'},
    {typeName: '测试1', name: '名称2', targetMoney:'11', actualMoney: '10'},
    {typeName: '测试1', name: '名称3', targetMoney:'1010', actualMoney: '10'},
    {typeName: '测试1', name: '名称4', targetMoney:'10', actualMoney: '10'},
    {typeName: '测试2', name: '名称1', targetMoney:'22', actualMoney: '10'},
    {typeName: '测试2', name: '名称2', targetMoney:'10', actualMoney: '10'},
]

合并的字段可能不为一,则需要将合并的字段组成数据

//若字段需要依据某个字段的模块来合并,受限制时候,既父子关系,则需放入前一个字段的children中即可,参照效果图
let countField = [
   {
     field: 'typeName',
     children: [{
       field: 'name',
       children: [{
          field: 'targetMoney'
       }]
      }]
    }
];
//引入工具类
import { merge, spanMethod} from './mergeClass';


//在data中声明一个对象,用来存储计算出来后的每一个需要合并的字段的规则
this.merge = {};

//利用对象的浅拷贝赋值给一个值
let das = this.merge;

//new一个对象,并将  合并字段,存储对象, 数据  格式传入
let merges = new merge(countField, das, data);

//开始计算,并得出this.merge的结果,可console.log打印出this.merge,观察数据
merges.startCalculation();



/*
* 因为数据对比较大,需要时间。且涉及到三层级联,则需要在半秒后进行数据整合,为第三级以后setTimeout提供计算时间
*/

// 根据所在handsontable合并规则计算最终合并数据
// spanMethod(合并字段计算出的规则,所在handsontable显示的索引)

let mergeCells = this.hotSettings.mergeCells;
setTimeout(() => {
    
  //每一次spanMethod后得出的都是指定字段合并规则,所以多个字段需要多次将数据拼接到mergeCells
  mergeCells = mergeCells.concat(spanMethod(this.merge.typeName,1));
  mergeCells = mergeCells.concat(spanMethod(this.merge.name,2));
  mergeCells = mergeCells.concat(spanMethod(this.merge.targetMoney,3));
  
  //需要将所有合并数据计算完成后才能将数据赋值给handsontable,否则会使布局错乱
  this.hotSettings.data = JSON.parse(JSON.stringify(data));
  
  //在获取数据时候就将loading打开,提升用户体验
  this.contentLoading = false;
    
},500);

使用建议

  • handsontable使用较为复杂,不建议二次封装成组件来使用

  • j建议:直接将代码复制使用

  • 本源码中涵盖大部分handsontable常用属性,并标注释,可以自行查看

  • 源码中使用部分element-ui的组件,可替换成你所使用的组件,保留点击事件即可

  • 所开发功能大部分使用逻辑开发,可以稍微改后用于其他框架

开发者 & 其他

  • @title handsontable的简单二次封装
  • @author 遗忘
  • @time 2020-03-13
  • @QQ 1786787613
  • @other 欢迎提交bug,请写清楚遇到问题的原因,开发环境,复显步骤。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 要招一个会vue的开发者: 作为面试官的你,你还会每次都只是问这些老土的问题吗?你对MVVM的理解是什么?你知道什...
    浪子神剑阅读 23,241评论 0 260
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 4,890评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,916评论 2 140
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 13,317评论 0 72
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    王喂马_阅读 11,531评论 1 77

友情链接更多精彩内容