element-ui合计逻辑踩坑

news2025/1/11 4:26:25

element-ui合计逻辑踩坑

1.快速实现一个合计

​ Element UI所提供的el-table中提供了方便快捷的合计逻辑实现:

​ https://element.eleme.cn/#/zh-CN/component/table

在这里插入图片描述

​ 此实现方法在官方文档中介绍详细,此处不多赘述。

​ 这里需要注意,el-table所提供的自定义求和方法summary-method所获得的返回值是一个一维数组

​ 数组的顺序对应了列的顺序,以填充的方式将数组的值放入合计行。

2.实现一个多行合计的逻辑

​ 某些场景下,需要列表页同时展示总合计本页合计,但是el-table实际提供的自定义方法仅支持一个一维数组,仅能支持一行合计行的快速实现。

​ 如果想要实现多行合计行,有以下两种方案:

方案一:在自定义的合并方法中自定义包含HTML标签的返回值以实现复杂合计逻辑。

​ https://blog.csdn.net/qq_33475629/article/details/134008888

此博客实现了一行中的多个合计数据。

​ 详细可参考上述博客,此博客通过在vue代码中嵌入html标签实现了多行合并,核心代码如下:

getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          // 通过<br/>实现换行,达到2行的效果
          sums[index] =  <p>当前页面总计<br/><br/>总计</p>;
          return;
        }
        
        let countArr = [];//element原本的总计:当前页面计算的值 集合
        const values = data.map((item) => Number(item[column.property]));
        if (!values.every((value) => isNaN(value))) {
          countArr[index] = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
            } else {
              return prev;
            }
          }, 0);
          // 根据列表字段判断 取值
          if (column.property == 'total') {
            sums[index] = <p>
                {countArr[index]}<br/><br/>//第一行数据是当前页面值相加
                {this.apiData.account}<br/><br/>//第二行数据是后端接口返回
              </p>
          }
        } else {
          sums[index] = "-";
        }
      });
      return sums;
    },

效果图:

img

​ 实际逻辑为向summary-method所定义的自定义方法返回的数组中,直接放入HTML用于数据的填充。

​ 即如果数组中的值是value,则显示value;如果是HTML则会显示HTML。

​ 既然已经知道了合计行的自定义方法会如实返回HTML,那么对于一个原本只能返回一维数组的方法,我们可以向这个一维数组中塞入任何自定义的东西以实现复杂的逻辑——多行合计行分开。

​ https://blog.51cto.com/u_16213582/10217379

此博客实现了多行且不合并的逻辑。

​ 可进入此博客查阅,可发现其实现逻辑极其复杂,不乏在JS中额外关注字段名称、HTML布局的逻辑,所以不推荐此种写法。

​ 上述方案,单行实现尚可,但多行实现方案尽失优雅,故有以下方案二。

方案二:通过umy-ui中的u-table实现summary-method方法实现方便快捷的合计逻辑。

​ 官方文档:http://www.umyui.com/umycomponent/totalTable

u-table的合计与el-table的合计本质区别在于,u-table自定义方法返回值是一个二维数组

​ u-table关于合计的实现与el-table大同小异:

在这里插入图片描述

​ 原el-table返回的一维数组只可返回一行,u-table通过返回一个二维数组,可实现返回多行,二维数组中每一个一位数组代表了一行合计行,且兼顾了自定义内容。其实现逻辑可参考官方文档,较之方案一方便快捷优雅。

​ 且umy-ui是由element-ui进行改造所得,且经过多次实践,可兼容element-ui,方案具有可行性。

需要注意的是,当使用u-table时,因为u-table的结构与el-table不同而不可用,所以要针对u-table修改不分逻辑。

3.实现一个较为复杂的自定义多行合计逻辑

​ 基于2-方案二中所述,umy-ui同时提供了多行合计与自定义逻辑,关于自定义方法,官方文档的案例如下:

const values = data.map(item => Number(item[column.property]));
// 合计
if (!values.every(value => isNaN(value))) {
    means[columnIndex] = values.reduce((prev, curr) => {
        const value = Number(curr);
        if (!isNaN(value)) {
            return prev + curr;
        } else {
            return prev;
        }
    }, 0);
    // means[columnIndex] += ' 元'
    // 改变了ele的合计方式,扩展了合计场景
    // 你以为就只有上面这样玩吗?错啦,你还可以自定义样式哦
    // means[columnIndex] = '<span style="color: red">' + means[columnIndex] + '元</span>'
    means[columnIndex] = '<span style="color: red">' + means[columnIndex] + '元</span><br/><span>123</span>'
} else {
    means[columnIndex] = '';
}

​ 但是如果我们不满足于span或者br这种HTML原生标签,想要在每个单元格中使用el-button或者其他逻辑的组件。

​ 首先易于想到的办法为在summary-method中直接写入el-button,但是实际上组件在summary-method并不会成功被渲染,查阅后有博客说是因为当此方法执行时,表格已经渲染完毕,但el-button并不会第二次被渲染,从而无法成功插入自定义的组件。

​ 所以我们可知只需要当数据变动后,合计数据可以计算得出时,我们可以直接对DOM元素进行操作实现,再去手动插入el-button关联事件,那么我们可以对表格数据datas进行监听。

​ 实际案例如下:

// 自定义合计方法
getSummaries({ columns, data }) {
    let means = [] // 合计
    columns.forEach((column, columnIndex) => {
        if (columnIndex === columns.length - 7) {
            means.push('本页合计')
            return
        }
        const values = data.map((item) => Number(item[column.property]))
        // 合计
        if (!values.every((value) => isNaN(value))) {
            means[columnIndex] = values.reduce((prev, curr) => {
                const value = Number(curr)
                if (!isNaN(value)) {
                    return prev + curr
                } else {
                    return prev
                }
            }, 0)
            // 这里的值会有一个0.000000000001的精度损失,通过toFixed排除这种损失
            means[columnIndex] = formateNumber(means[columnIndex].toFixed(2))
        } else {
            means[columnIndex] = ''
        }
    })
    return [means, this.datasSummary]
}
  watch: {
     // 对datas进行监听
    datas: function() {
      let _this = this
      this.$nextTick(() => {
        // 获取合计那一行的DOM
        let array = _this.$refs.mainTable.$refs.singleTable.$refs.footerWrapper.querySelector('.el-table__footer').querySelectorAll('td')
        let endNum = 0
        // 从倒数第六个开始遍历(因每行为6个,我只需要最后一行为按钮)
        for (let i = array.length - 6; endNum < 6; endNum++, i++) {
          let html = array[i].querySelector('.cell')
          let textContent = array[i].querySelector('.cell').textContent
          // 手动拼接按钮
          html.innerHTML = "<el-button type='text' style='cursor: pointer;color: #3b8bdb;' > " + textContent + '</el-button>'
          // 绑定click事件
          html.onclick = () => {
            switch (i) {
              case array.length - 6:
                _this.jumpToProvinceInventory(null, 'total', textContent)
                break
            }
          }
        }
      })
    }
  }

​ 最终的效果如下:
在这里插入图片描述

​ PS:此处的总合计数据为后台请求而来。

​ 使用合计时,偶尔会出现合计行加载不出或者加载慢的情况,其原因在于页面在渲染的时候,其实已经渲染出了合计行,但是合计行在计算布局的时候出现问题,导致合计行被列表页所遮挡(打开F12查看元素可发现),故没有展示。

​ 所以通过以下逻辑,手动重新计算布局即可解决:

<el-table
  ref="mainTable"
  show-summary
  border>
</el-table>
updated() {
    this.$nextTick(() => {
        this.$refs['mainTable'].doLayout()
    })
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Don‘t fly solo! 量化之路,AI伴飞

在投资界&#xff0c;巴菲特与查理.芒格的神仙友谊&#xff0c;是他们财富神话之外的另一段传奇。巴菲特曾这样评价芒格&#xff1a;他用思想的力量拓展了我的视野&#xff0c;让我以火箭的速度&#xff0c;从猩猩进化到人类。 人生何幸能得到一知己。如果没有这样的机缘&…

每日学习笔记:C++ STL算法之容器元素变序

目录 反转元素次序 reverse(beg, end) reverse_copy(srcBeg, srcEnd, destEnd) 旋转元素 旋转&#xff1a;rotate(beg, newBeg, end) 复制同时旋转&#xff1a;rotate_copy(srcBeg, srcNewBeg, srcEnd, destBeg) 对元素做排列组合情况列举与切换 next_permutation(beg, …

国产化里程碑:明道云HAP私有部署版获信创评估证书,荣登会员单位

近期&#xff0c;明道云HAP私有部署版荣获信创产品评估证书&#xff0c;这一成就不仅标志着我们在信创领域的深入布局和持续努力获得了行业的广泛认可&#xff0c;也是对我们积极拥抱和推动国产化技术发展的肯定。更值得一提的是&#xff0c;我们还被授予“成员单位”的称号&am…

基于通达信---做T专用算法

什么是做T? 股票做T是股票市场中常见的一种投资策略,也就是股票进行T+0操作,通过当天买进的股票,在当天卖出,是股市中常见的一种超短线的操作。其中T就是指交易日,利用交易日中的股票涨跌来赚取差价。股票做T常见的类型就是正T和倒T。 1、正T 股票做正t就是指先买后卖,…

Rokid AR Lite空间计算套装发布,中国空间计算踏上差异化领先之路

动动手指、动动眼睛就可以“操控一切”&#xff0c;这种颇具科幻感、未来感的交互方式&#xff0c;令许多人感叹“未来已来”。而这令人震撼的变革背后&#xff0c;正是空间计算技术的迅猛崛起与广泛应用&#xff0c;使得这种曾经只存在于想象中的交互方式&#xff0c;如今正逐…

快速访问github

修改本地hosts文件 GitHub访问慢的原因在于域名解析&#xff0c;通过修改本地的hosts文件&#xff0c;将远程DNS解析改为本地DNS解析。 fang 步骤1&#xff1a;打开hosts文件&#xff08;没有就创建&#xff09; host所在位置&#xff1a; C:\Windows\System32\drivers\etc…

linux jenkins 2.89.1 安装部署 持续构建svn下maven项目并部署到tomcat

从这边博文可以学习到&#xff1a; jenkins的安装修改主目录初始化新建任务&#xff0c;构建第一个maven项目将构建完成的项目部署到tomcat Jenkins的安装相当简单&#xff0c;只需要从官网下载war包&#xff0c;放入tomcat&#xff0c;运行tomcat就可以访问Jenkins了 准备工作…

PyCharm,终端conda环境无法切换的问题(二个解决方案)

问题 PyCharm终端&#xff0c;环境切换无效&#xff0c;默认始终为base 解决一 Settings->Tools->Terminal->ShellPath&#xff0c;将powershell修改为cmd.exe 解决二 conda config --show在输出中找到 auto_activate_base 的行&#xff0c;发现被设置为 true&#x…

数据结构-双链表(图解)

目录 双链表&#xff08;Double-Linked List&#xff09;的概念与基本特性 一、双链表的基本组成 二、双链表的主要特性 三、双链表的操作 代码展示 malloc开辟函数 解析 初始化 解析 头插 解析 尾插 解析 头删 解析 尾删 解析 pos之后插入 解析 pos删除 …

抖音小店无货源怎么做?教你新店快速起店新攻略,你还在等什么?

大家好&#xff0c;我是电商花花。 从我关注抖音小店这个风口到现在已经有很长时间了&#xff0c;从了解到实操到复盘&#xff0c;陆陆续续将多家单店店铺月营业额达到数百万。 目前团队运营着80多家店铺&#xff0c;人均管理3-5个店铺&#xff0c;大部分店铺月营业额都在5W-…

【C++】飞机大战项目记录

源代码与图片参考自《你好编程》的飞机大战项目&#xff0c;这里不进行展示。 本项目是仅供学习使用的项目 飞机大战项目记录 飞机大战设计报告1 项目框架分析1.1 敌机设计&#xff1a;1.2 玩家飞机控制&#xff1a;1.3 子弹发射&#xff1a;1.4 游戏界面与互动&#xff1a;1.5…

文本美学:text-image打造视觉吸引力

当我最近浏览 GitHub 时&#xff0c;偶然发现了一个项目&#xff0c;它能够将文字、图片和视频转化为文本&#xff0c;我觉得非常有趣。于是我就花了一些时间了解了一下&#xff0c;发现它的使用也非常简单方便。今天我打算和家人们分享这个发现。 项目介绍 话不多说&#xf…

OpenHarmony 上传和下载(API 10)教程~

介绍 本示例使用ohos.request接口创建上传和下载任务&#xff0c;实现上传、下载功能&#xff0c;hfs作为服务器&#xff0c;实现了文件的上传和下载和任务的查询功能。 效果预览 使用说明 1.本示例功能需要先配置服务器环境后使用&#xff0c;具体配置见上传下载服务配置。…

百度AI大会发布的APP Builder和Agent Builder有什么区别

百度在AI大会发布了三款AI工具&#xff0c;包括智能体开发工具AgentBuilder、AI原生应用开发工具AppBuilder、各种尺寸的模型定制工具ModelBuilder 有很多人就问&#xff0c;APP Builder和Agent Builder有什么不一样&#xff0c;怎么那么多builder? 你们就这么理解&#xff…

大语言模型隐私防泄漏:差分隐私、参数高效化

大语言模型隐私防泄漏&#xff1a;差分隐私、参数高效化 写在最前面题目6&#xff1a;大语言模型隐私防泄漏Differentially Private Fine-tuning of Language Models其他初步和之前的基线微调模型1微调模型2通过低秩自适应进行微调&#xff08; 实例化元框架1&#xff09; 在隐…

MySQL面试题 3

问题1&#xff1a;char、varchar的区别是什么&#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的&#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么&#xff1f; DELETE命令从一个表中删除某一行&#xff0c;或多行&#xff0…

机器学习系统的设计

1.混淆矩阵 混淆矩阵作用就是看一看在测试集样本集中&#xff1a; 真实值是 正例 的样本中&#xff0c;被分类为 正例 的样本数量有多少&#xff0c;这部分样本叫做真正例&#xff08;TP&#xff0c;True Positive&#xff09;&#xff0c;预测为真&#xff0c;实际为真真实值…

Java反射(reflection)java很多框架的底层都需要用到反射,至于API使用的话,还算简单,主要是类加载过程和反射机制的一个底层机制要了解一下

十六、反射&#xff08;reflection&#xff09; 反射可以通过外部文件配置&#xff0c;在不修改源码的情况下来控制程序&#xff0c;符合设计模式中的OCP原则&#xff08;开闭原则&#xff1a;不修改源码&#xff0c;扩容功能&#xff09;。 1、反射机制 &#xff08;1&…

SpringCloud系列(7)--Eureka服务端的安装与配置

前言&#xff1a;上一章节我们介绍了Eureka的基础&#xff0c;本章节则介绍Eureka服务端的安装与配置 Eureka架构原理图 1、创建Eureka Server端服务注册中心模块 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 (3)填写子模块的名称&#xf…

【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

目录 一&#xff0c;函数重载1.1 函数重载的定义1.1.1.形参的类型不同1.1.2参数的个数不同1.1.3.参数的顺序不同1.1.4.有一个是缺省参数构成重载。但是调用时存在歧义1.1.5.返回值不同&#xff0c;不构成重载。因为返回值可接收&#xff0c;可不接受&#xff0c;调用函数产生歧…