当前位置: 首页 > article >正文

el-table根据指定字段合并行和列+根据屏幕高度实时设置el-table的高度

文章目录

  • html代码
  • script代码
  • arraySpanMethod.js代码

html代码

<template>
   <div class="rightBar">
     <cl-table 
	     ref="tableData"
	     border 
	     :span-method="arraySpanMethod" 
	     :data="tableData" 
	     :columns="columns"
	     :max-height="maxHeight" 
	     row-key="id" 
	     cell-default>
     </cl-table>
   </div>
</template>

script代码

import arraySpanMethod from '@/mixin/arraySpanMethod'
export default{
   mixins: [arraySpanMethod],
   data(){
        //表格数据
        tableData: [],
        maxHeight: 500,
        columns:[
           {
            label: "业务大类",
                prop: "busi",
                align: "center",
                render: (vn, row, index) => {
                    return (
                        <div>
                            {row.busi && <span>{row.busi}</span>}
                            {!row.busi && <span style="color:#cccccc">--</span>}
                        </div>
                    )
                }
            },
            {
                label: "业务细类",
                prop: "busiDetail",
                align: "center",
                render: (vn, row, index) => {
                    return (
                        <div>
                            {row.busiDetail && <span>{row.busiDetail}</span>}
                            {!row.busiDetail && <span style="color:#cccccc">--</span>}
                        </div>
                    )
                }
            },
        ]
    },
     watch: {
        tableData: {
            deep: true,
            immediate: true,
            handler: function (val) {
                if (val.length) {
                    this.$nextTick(() => {
                      // 调用this.mergeCell需要满足两个条件:1.tableData数据改变 2.dom渲染完成
                      // this.mergeCell(a,b,c,d)
                      // a-table的节点 b-要合并的字段 c-行相同合并 d-列相同合并
                        var ss = this.mergeCell(this.$refs.tableData, ['busi', 'busiDetail'], true, true)
                        this.mergeMap = ss
                    })
                }
            }
        }
    },
    methods:{
    // 根据屏幕的高度 实时更新table的高度
     resize() {
            this.$nextTick(() => {
                this.maxHeight = this.$refs['rightBar'].clientHeight - 140
            })
        },
    },
    //生命周期 - 挂载完成(可以访问DOM元素)
    mounted() {
        this.resize();
        window.addEventListener('resize', this.resize)
    },
    // 销毁监听事件
    destroyed() {
        window.removeEventListener('resize', this.resize)
    },
}

arraySpanMethod.js代码

// 合并单元格
export default {
    data() {
        return {
            mergeMap: []
        }
    },
    methods: {
        arraySpanMethod({ rowIndex, columnIndex }) {
            var map = this.mergeMap
            try {
                var r = map[rowIndex][columnIndex]
                return r
            } catch (error) {
                return r
            }
        },
        mergeCell(table, colMap, isSpanRow = true, isSpanCol = true) {
            var list = table.data
            // table.tableData 中 每行的数据是一个对象,不能直接的反应显示的顺序
            // 即你不能知道第一列右则的列是那个.
            // 需要通过table.columns建立显示的顺序
            var columns = []
            for (const item of table.columns) {
                columns.push(item.prop)
            }
            // 结果应是一个二维数组
            // 先充填数据,使用其成为全显示的数组
            var result = []
            for (let row = 0, rowLen = list.length; row < rowLen; row++) {
                const ss = []
                for (let col = 0, colLen = columns.length; col < colLen; col++) {
                    ss.push([1, 1])
                }
                result.push(ss)
            }
            // 合并行
            if (isSpanRow) {
                result = this.mergeRow(list, columns, colMap, result)
            }
            // 合并列
            if (isSpanCol) {
                result = this.mergeCol(list, columns, colMap, result)
            }
            return result
        },
        mergeRow(list, columns, colMap, result) {
            for (const item of colMap) {
                const p = {
                    colKey: item,
                    col: columns.indexOf(item),
                    row: 0,
                    val: ''
                }
                for (let row = 0, rowLen = list.length; row < rowLen; row++) {
                    if (p.val === list[row][p.colKey]) {
                        result[p.row][p.col][0] += 1
                        result[row][p.col][0] = 0
                    } else {
                        p.row = row
                        p.val = list[row][p.colKey]
                    }
                }
            }
            return result
        },
        mergeCol(list, columns, colMap, result) {
            for (let row = 0, rowLen = list.length; row < rowLen; row++) {
                const p = {
                    col: 0,
                    row: row,
                    val: ''
                }

                for (let col = 0, colLen = columns.length; col < colLen; col++) {
                    if (!colMap.includes(columns[col])) {
                        p.col = col
                        p.val = list[row][columns[col]]
                        continue
                    }

                    if (p.val === list[row][columns[col]]) {
                        result[p.row][p.col][1] += 1
                        result[p.row][col][1] = 0
                    } else {
                        p.col = col
                        p.val = list[row][columns[col]]
                    }
                }
            }
            return result
        }
    }
}

http://www.kler.cn/a/404669.html

相关文章:

  • GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
  • @RequestBody、@Data、@Validated、@Pattern(regexp=“?“)(复习)
  • 游戏行业趋势:“AI、出海、IP”大热下,如何提升竞争力?
  • SpringCloud多机部署,负载均衡-LoadBalance
  • 测试工程师如何在面试中脱颖而出
  • 实际开发中的协变与逆变案例:数据处理流水线
  • async在js中是强制同步的意思吗
  • 无人机的激光雷达避障系统阐述!
  • vmware虚拟机给创建的centos扩展磁盘步骤
  • 【MySQL实战45讲笔记】基础篇——深入浅出索引(上)
  • 利用代理IP爬取Zillow房产数据
  • 实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾
  • C++学习——编译的过程
  • 【软考】系统架构设计师-信息系统基础
  • 1.1 爬虫的一些知识(大模型提供语料)
  • 渗透测试学习笔记—shodan(1)
  • Flink错误:一historyserver无法启动,二存在的文件会报错没有那个文件或目录
  • 乐鑫芯片模组物联网方案,智能设备升级新选择,启明云端乐鑫代理商
  • 2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解
  • 面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
  • Android Studio2024版本安装环境SDK、Gradle配置
  • 【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用
  • Smartbi Insight V11与OceanBase完成产品兼容互认证
  • 适合二开a的web组态?
  • “无关紧要”的小知识点:“xx Packages Are Looking for Funding”——npm fund命令及运行机制
  • AQS 理解 及不可重入锁实现