view UI 表格合并问题解决

最近开发过程中遇到了单元格合并,现将经验分享一下。

组件库 View Ui 

组件库地址:http://v4.iviewui.com/components/table

先上原型图(数据就不上了)

上图中可以清晰的看到当前只有行合并(列合并没要求)

1-5 和 1-6 是自己添加的索引列

达成当前效果需要数据格式为:

data = {
  name: 'xxx', // 第一列名称
  idName: 'xxx', // 第二列名称
  childerList: [{},{},{}] // 表格主要渲染对象,用于判断合并以及添加序列号
}

 大致数据结构就是这个样子。下面详细讲解一下上述表格实现代码

<!-- html部分 -->
<!-- :span-method  4.0.0设置属性 span-method 可以指定合并行或列的算法。  -->
<Table :columns="columns" :data="dataList" border :span-method="handleSpan"></Table>


// js部分
data() {
 return {
 // columns 中的所有定义皆与合并无关
 columns: [
  {
    title:'系统',
    key:'sys',
    tooltip: true, // 开启后,文本将不换行,超出部分显示为省略号,并用 Tooltip 组件显示完整内容
    render: (h, params) => {  // 项目需要在表格中添加图片  所以使用自定义单元格  与合并行无关
       let that = this  // on 对象中的this 指向不是当前组件本身
       return h("div", { // 当前单元格替换为div
         style: {
            display: 'flex'
         }
       }, [
         h("span", params.row.sys),
         h("img", {
           attrs:{
             src: require("@/assets/xxx/png"), // 必须node引入文件方式, 
           },
           style: {},
           on: {
             click() {
                // 图片点击处理逻辑
             }
           }
         })
       ])
    }
  },
  {
    title:'权重',
    key: 'scroeWeight'
  },
  {
    title:'序号',
    key: 'index'
  },
  {
    title:'xxx',
    key: 'xxx'
  },
  {
    title:'xxx',
    key: 'xxx'
  },
  {
    title:'xxx',
    key: 'xxx'
  },
  {
    title:'xxx',
    key: 'xxx'
  }

],

dataList:[], // 表格数据数组
}
}

methods: {
    // data 为上图后端返回数据结构类型
    setDatalist(data) { // 因后台返回数据未告知行合并位数,故此,做合并前数据处理。数据格式ok的                请忽略这个功能函数
        let list = data.map(item => {
            if(item.childerList.length > 0) {
                return item.childerList.map((item1, index) => {
                    item1.index = index + 1 // 添加第三列序号数据
                    if(index === 0) {
                        item1.rowSpan = item.childerList.length // 添加合并到第几行(重要)
                    }
                })
            } else {
                // 不需要合并的处理
                item.rowSpan = 1
                item.index = 1
                return [item]
            }
        })
        this.dataList = list.flat(1) // 展开数组并赋值
    },
    // 合并单元格处理函数
    handleSpan({row,column,rowIndex,columnIndex}) {
        // 因为我只需要合并第一列和第二列,所以判断是否为 第一列  第二列
        if(columnIndex===0 || columnIndex===1){
            // 判断当前行是否有我添加的合并行属性, 有则进行合并
            if(row['rowSpan']) {
                return [row['rowSpan'], 1]

                // 也可写成对象写法
                // return {
                //       rowspan: row['rowSpan'],
                //       colspan: 1
                //    };
            } else {
                // 没有则表示当前为合并行,需返回0
                return [0, 0]
                // 也可写成对象写法
                // return {
                //       rowspan: 0,
                //       colspan: 0
                //    };
            }
        }
    }
}

合并行列最重要的就是:  span-method="handleSpan"方法了,当然,动态数据处理时应得知当前需要合并的行数,列数,在根据rowIndex和columnIndex进行判断,也可根据数据进行判断(目前没那种需求)。

今天就到这里了,自我收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值