iview Table表格组件无法拆分单元格的解决思路

2023-05-16

最近在开发的Vue项目中,使用了iview第三方UI库;对于表格组件的需求是最多的,但是在一些特定场景下,发现iview的表格组件没有单元格合并与拆分的API,搜了一下发现很多同学提问关于iview表格组件的单元格如何拆分和合并的问题。因此某家在此说下我们在项目中如何填的这个坑。
因为我们项目中首要的是单元格拆分的,因此以拆分为例。基本思路就是:不在源码层面进行修改;在外部对Table组件进行二次封装。使用vue render函数对表格组件的表格列配置数据进行动态改造,普通单元格渲染span标签呈现数据,要拆分的单元格渲染原生table标签;最后隐藏嵌套表格的边框及调整相关原生表格样式。
这里注意之前打算用iview Table组件进行嵌套,但是发现修改table组件的样式非常麻烦,而且没有效果,一不小心就容易污染全局样式,因此后来用原生table标签完美解决样式不可控问题。

1. 首先对于整体表格的列配置数据中有拆分的列进行添加split为true的属性。
图片描述

2.对于表格数据源进行子表格数据定义,也就是用数组的形式包含子表格数据

clipboard.png

3.使用vue render函数动态渲染改造表格列结构,通单元格渲染span标签呈现数据,要拆分的单元格渲染原生table标签。

      let vm = this;
      this.columnsList.forEach(item => {
        // 可编辑单元格
        if (item.editable) {
          item.render = (h, param) => {
            let currentRow = this.thisTableData[param.index];
            if (currentRow.editting) {
              // 正在编辑
              if(item.split){
                    var childArray = currentRow[item.key];
                    var inputArray=[];
                    childArray.forEach(item => {
                          var aa = h('Input', {
                                      style:{
                                          width:'80%',
                                          'margin-top':'10px',
                                          'margin-bottom':'10px'
                                       },
                                      props: {
                                          type: 'text',
                                          value: item.child
                                       },
                                      on: {
                                            'on-change' (event) {
                                                  let key = param.column.key;
                                                  var ddd = vm.edittingStore[param.index][key];
                                                  //item.child = event.target.value;
                                                  //计算当前的索引
                                                  var currentIndex = childArray.indexOf(item);
                                                  //更新数据
                                                  vm.edittingStore[param.index][key][currentIndex].child = event.target.value;
                                             }
                                       }
                           });
                          inputArray.push(aa)

                          var currentIndex = childArray.indexOf(item);
                          if(currentIndex!==childArray.length-1){
                                var bb = h('hr',{
                                            style:{
                                                height:'1px',
                                                'background-color':'#e9eaec',
                                                border:'none'
                                             }
                                 })
                                inputArray.push(bb)
                           }
                     })
                    return h('Row',inputArray)
               }
              else
              {          
                    return h('Input', {
                                style:{
                                    width:'80%'
                                },
                                props: {
                                    type: 'text',
                                    value: currentRow[item.key]
                                },
                                on: {
                                    'on-change' (event) {
                                        let key = param.column.key;
                                        vm.edittingStore[param.index][key] = event.target.value;
                                    }
                                }
                     });
               }
            } else {
              // 没在编辑
              if (this.editIncell) {
                // 单元格内编辑
                return h('Row', {
                  props: {
                    type: 'flex',
                    align: 'middle',
                    justify: 'center'
                  }
                }, [
                  h('Col', {
                    props: {
                      span: '16'
                    }
                  }, [
                    currentRow.edittingCell[param.column.key] ? cellInput(this, h, param, item) : h('span', currentRow[item.key])
                  ]),
                  h('Col', {
                    props: {
                      span: '8'
                    }
                  }, [
                    currentRow.edittingCell[param.column.key] ? saveIncellEditBtn(this, h, param) : inCellEditBtn(this, h, param)
                  ])
                ]);
              } else {
                // 非单元格内编辑
                  if(item.split){

                        if(currentRow.childProject.length==1){
                            var value = currentRow.childProject[0].child;
                            return h('span', value);
                        }

                        //用原生HTML标签渲染
                        var trAarry=[];
                        var childArray = currentRow[item.key];
                        childArray.forEach(item => {
                              var aa = h('tr',{},[
                                        h('td',{
                                            style:{
                                                border:0,
                                                'text-align':'center'
                                            }
                                        },item.child),
                              ])
                              trAarry.push(aa)
                                    
                              var currentIndex = childArray.indexOf(item);
                              if(currentIndex!==childArray.length-1){
                                    var bb = h('hr',{
                                            style:{
                                                height:'1px',
                                                'background-color':'#e9eaec',
                                                border:'none'
                                             }
                                    })
                                    trAarry.push(bb)
                              }
                        })

                        return h('table',{style:{
                                  'width':'100%',
                                  margin:0,
                                  border:0
                        }},trAarry)
                  }
                  else  return h('span', currentRow[item.key]);
              }
            }
          };
        }
        // 编辑和删除按钮
        if (item.handle) {
          item.render = (h, param) => {
            let currentRowData = this.thisTableData[param.index];
            let children = [];
            item.handle.forEach(item => {
              if (item === 'edit') {
                children.push(editButton(this, h, currentRowData, param.index));
              } else if (item === 'delete') {
                children.push(deleteButton(this, h, currentRowData, param.index));
              }
            });
            return h('div', children);
          };
        }
      });
    } 

4.完美实现了单元格拆分为列的效果。
图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iview Table表格组件无法拆分单元格的解决思路 的相关文章

  • CSS 元素垂直居中的 6种方法

    转自 http blog zhourunsheng com 2012 03 css E5 85 83 E7 B4 A0 E5 9E 82 E7 9B B4 E5 B1 85 E4 B8 AD E7 9A 84 6 E7 A7 8D E6 9
  • 多表可更新视图的实现

    多表关联后的数据能保证主键唯一的视图是可直接做更新 不需要用触发器实现 多表视图的定义 当视图的数据源只有一张数据表 则该视图为单表视图 当视图的数据源是多张数据表 则该视图为多表视图 可更新视图的定义 在绝大多数人的概念中 视图是只读的
  • oracle的long类型字段的应用

    1 LONG 数据类型中存储的是可变长字符串 最大长度限制是2GB 2 对于超出一定长度的文本 基本只能用LONG类型来存储 数据字典中很多对象的定义就是用LONG来存储的 3 LONG类型主要用于不需要作字符串搜索的长串数据 如果要进行字
  • cx_Oracle使用方法

    正确安装好cx oracle之后 要使用它来连接到oracle数据库进行操作 具体应该分3步走 第一步 导入cx Oracle 建立连接 gt gt gt import cx Oracle 导入模块 gt gt gt db cx Oracl
  • 自定义TableViewCell的使用方法

    新建TableViewCell类 继承父类为UITableViewCell 1 1 TableCell h import
  • SQL Server学习之复合索引

    概要什么是单一索引 什么又是复合索引呢 何时新建复合索引 复合索引又需要注意些什么呢 本篇文章主要是对网上一些讨论的总结 一 概念单一索引是指索引列为一列的情况 即新建索引的语句只实施在一列上 用户可以在多个列上建立索引 这种索引叫做复合索
  • 一段程序:SAP使用ODI方法为WORD填充数据

    未做测试 仅记备查 原文地址 http blog sina com cn s blog 3eefd36c01008cmz html 原理 通过 CALL METHOD DOCUMENT gt GET MAIL MERGE INTERFACE
  • 分拆TableSplit 让多个mapper同时读取

    分拆TableSplit 让多个mapper同时读取 默认情况下 一个region是一个tableSplit 对应一个mapper进行读取 但单mapper读取速度较慢 因此想着把默认一个table split分拆成多个split 这样ha
  • 抓取中国银行汇率函数

    抓取中国银行汇率表数据 string file source 要抓取的内容页 string file target 本机生成的文件 function getRate file source file target if file sourc
  • Table固定表头固定左侧列

    效果图 思路 把需要固定的内容进行拆封 比如左侧的表头和内容 右侧的表头和内容 都单独的存放在一个table中 在滚动条滚动的时候通过jquery scroll 区分横向纵向滚动条的方法来实现左侧内容的滚动和右侧表头的滚动 第一步 div
  • Oracle中没有 if exists(...)

    对于Oracle中没有 if exists 的语法 目前有许多种解决方法 这里先分析常用的三种 推荐使用最后一种 第一种是最常用的 判断count 的值是否为零 如下 declare v cnt number begin select co
  • 数据控制类别(CC1和CC2)——DO-178B/ED-12B学习笔记之七

    数据控制类别 CC1和CC2 DO 178B ED 12B学习笔记之七 为了理解数据控制类别 CC1和CC2 的定义 先看DO 178B的7 3条 原文 Software life cycle data can be assigned to
  • MYSQL字符串大小写 缺省行为

    今天遇到一个主键冲突的文件 我看两条记录的主键明明不一样 一条是大写的JAA 另外一条是小写的jaa 莫灰是mysql对字段的值不区分大小写 在网上查了一下 还真是 默认情况下 找了一篇文章 摘自 http www oklinux cn h
  • ORACLE深入 第五章 Locking and Latching

    ORACLE深入 第五章 Locking and Latching Locks 在单用户系统 LOCKS是不需要的 在多用户系统 为了让多用户访问数据 修改数据 修改数据结构 就需要一个机制来保证大家的一致性修改 该用LOCK的时候就用LO
  • 使用@Id时主键生成策略:TABLE、SEQUENCE、IDENTITY、AUTO

    主键生成策略 GenerationType TABLE GenerationType SEQUENCE GenerationType IDENTITY GenerationType AUTO TABLE 使用一个特定的数据库表格来保存主键
  • 创建索引分区

    Oracle学习四 创建 索引分区 作者 mckobe23 http mckobe23 itpub net 发表于 2007 03 13 18 30 分类 Oracle 出处 http mckobe23 itpub net post 291
  • LayUI table 刷新页面不重置页码

    layui table 刷新页面时会自动将页码初始化成1 本章内容介绍怎么让layui table刷新页面后留在当前页 要实现此方法主要使用到cookie存储最后一次翻页的页码 主要修改layui lay modules table js文
  • 查询SQL表占用空间(sp_spaceused 表名)

    create table tablespaceinfo 狦 nameinfo varchar 50 rowsinfo int reserved varchar 20 datainfo varchar 20 index size varcha
  • vue_elementui_formatter的使用方法_elementui提取table表格使用formatter方法

    后台管理系统中用到了非常多的表格 一般为了方便都会讲表格进行提取 形成公共组件 提取表格时会遇到返回的json数据中要对单个字段进行处理 如时间戳转换 状态转换等 封装的表格组件代码
  • 解决iview打包时UglifyJs报错

    使用npm run dev时运行是ok的 但是npm run build打包时iview报错 如下 原因是iview中使用了es6语法 然而uglifyJs是不支持的 打开我们的build webpack prod conf js文件 可以

随机推荐