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

element-plus table合并列、合计行、表格填报添加验证

1 说明

1、table 合并列:el-table 添加 span-method 方法,方法(mergeCells )内可以写死指定的合并列2、table 添加合计行:el-table 添加 :summary-method 方法,方法(getSummaries )内可以写死求和列
,这里更推荐修改方法:使用  "decimal.js" 计算,因为js 小数计算不精准3、表格填报添加验证:
1)添加el-from 包裹表格,并且添加model、rules,注意 el-from、table 绑定的数据要有关系;
2)el-form-item 绑定 :prop="`itemList.${scope.$index}.planAmount`" :rules="rulesTab.planAmount">
3)添加 style 美化样式,见模板 ,美化后的样式如下图

在这里插入图片描述

2 方法模板

<template>
<el-row><el-col :span="24" class="blocker contenter"><div class="d-flex" style="margin-bottom: 10px;"><div style="font-weight: bold;">列表</div><div style="margin-left: auto;"><el-button class="tool-btn" type="primary" icon="Edit" @click="submitForm">保存</el-button></div></div><el-form ref="tableDataFromRef" :model="formData" :rules="rulesTab" class="tableDataFrom"><el-table:data="formData.itemList":span-method="mergeCells":summary-method="getSummaries"borderheight="66vh"style="width: 100%; margin-top: 20px":row-style="{'height':'40px','font-size':'14px'}":cell-style="{'padding':'0 5px'}"><el-table-column type="index" label="序号" width="70" align="center"/><el-table-column prop="feeLv2Name" label="费用项目" width="170" align="center"/><el-table-column :label="`${queryParamFormData.planMonth?.substring(5,8)}月`" align="center"><el-table-column prop="planAmount" label="计划金额" width="130" align="right"><template #default="scope"><el-form-item :prop="`itemList.${scope.$index}.planAmount`" :rules="rulesTab.planAmount"><el-input-number v-model="scope.row.planAmount" precision="2" :controls="false":disabled="!isEditing"style="width: 115px"/></el-form-item></template></el-table-column></el-table-column></el-table></el-form></el-col>
</el-row></template>
<script setup>
import {ref, onMounted, watch} from 'vue'
import {ElMessage, ElMessageBox} from "element-plus";......const tableDataFromRef = ref()
const loading = ref(false)// 是否正在编辑
const isEditing = ref(false)// 表单信息
const formData = ref({id: null, itemList: [], status: null})// 表单的验证规则
const rulesTab = ref({planAmount: [{required: true, message: "计划金额不能为空", trigger: "blur"}]
})// 合并单元格
const mergeCells = ({row, column, rowIndex}) => {const mergeKeys = ['feeLv1Name', 'feeLv2Name', 'feeLv3Name']const prop = column.propertyconst data = formData.value.itemListif (!mergeKeys.includes(prop)) {return {rowspan: 1, colspan: 1}}// 不是第0行且和上一行值一样,则隐藏if (rowIndex > 0 && data[rowIndex][prop] === data[rowIndex - 1][prop]) {return {rowspan: 0, colspan: 0}}// 统计与当前行值相同的后续行数(仅限相邻)let rowspan = 1for (let i = rowIndex + 1; i < data.length; i++) {if (data[i][prop] === row[prop]) {rowspan++} else {break}}return {rowspan, colspan: 1}
}// 添加合计行
const getSummaries = ({columns, data}) => {const sums = []const sumKeys = ['planAmount']  // 指定需要求和的字段columns.forEach((column, index) => {if (index === 0) {sums[index] = h('div', {}, ['合计'])return}const property = column.propertyif (!sumKeys.includes(property)) {sums[index] = ''  // 非指定列不显示或写 'N/A'return}const values = data.map(item => Number(item[property]))if (!values.every(value => Number.isNaN(value))) {const total = values.reduce((sum, val) => {return Number.isNaN(val) ? sum : sum + val}, 0)sums[index] = `${total.toFixed(2)}`} else {sums[index] = 'N/A'}})return sums
}// 保存行信息
const submitForm = async () => {await tableDataFromRef.value.validate().then(() => {...保存方法}).catch(error => {ElMessage.warning("请不要填写空值!");})
}</script>
<style lang="scss" scoped>
// 调整表格中的样式,让提示美观
.tableDataFrom {.el-form-item {margin-bottom: 0;:deep(.el-input__wrapper) {background: transparent;padding: 0 5px;}:deep(.el-form-item__error) {z-index: -1;top: 0;}}
}
</style>
http://www.lqws.cn/news/541693.html

相关文章:

  • redisTemplate简单实现幂等性校验
  • fishbot随身系统安装nvidia显卡驱动
  • Rust交互式编程环境Jupyter Lab搭建
  • 【unitrix】 4.10 数字类型的按位异或运算实现(bitxor.rs)
  • 同样是synthesis(综合) HLS和Vivado里面是有什么区别
  • 【git学习】学习目标及课程安排
  • Java 大视界 -- Java 大数据在智能教育学习社群知识共享与协同学习促进中的应用(326)
  • 【HTML】
  • 中国科技术语杂志中国科技术语杂志社中国科技术语编辑部2025年第3期目录
  • 算法第55天|冗余连接、冗余连接II
  • C++ 第三阶段 并发与异步 - 第二节:异步任务(std::async)
  • 在docker容器中安装docker服务,基于fuse-overlayfs进行overlay挂载,而不是vfs
  • HarmonyOS NEXT仓颉开发语言实现画板案例
  • MySQL 离线安装MariaDB
  • SYSCFG 时钟在 GD32F4 系列微控制器中的作用
  • Layer by Layer: Uncovering Hidden Representations in Language Models
  • 当前最好的0样本文本转语音是哪个模型?
  • SpringCloud系列(38)--SpringCloud Gateway实现动态路由
  • 2024百度之星:BD202404 110串
  • JDY-23蓝牙模块与电脑的连接方式
  • 从0开始学习计算机视觉--Day04--损失函数
  • 杭州西湖断桥不断:3D扫描还原‘残雪‘视觉骗局
  • 在反向代理环境下精准获取客户端真实 IP 的最佳实践
  • Linux journal 日志大小限制与管理详解
  • vue-27(实践练习:将现有组件重构为使用组合式 API)
  • 七天学会SpringCloud分布式微服务——04——Nacos配置中心
  • 便携式水质检测仪的功能
  • 基于 SpringBoot+Vue 的台球厅管理系统的设计与实现(毕业论文)
  • [ linux-系统 ] 磁盘与文件系统
  • 排查 WebView 中 touch、click 事件失效:移动端调试过程详解