组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
碎碎念:有点难用,不丝滑(以下介绍的难点不是真的难,只是有点点点难用)
背景:需要实现表格的行列合并以及图标的嵌入,想到使用组件库组件来方便开发
链接:TDesign Web Vue Next
难点1:数据的定义
看到官方的代码实现,定义结构感觉有点乱
官方示例图:

官方代码:
这部分主要就是定义table结构,
data:表格数据;columns:表头结构
rowkey要定义,不然错误信息
rowspan-and-colspan:定义表格行列合并的规则(合并的框会框会覆盖后面的)
<template><div><t-table:bordered="true":data="data":columns="columns"row-key="i":rowspan-and-colspan="rowspanAndColspan"resizabletable-layout="fixed"lazy-load/></div>
</template>
然后是js里的
statusNameListMap定义的是type有关样式值,存关键的对象
data用new Array生成
colums里定义表头的结构,colspan定义的是列合并
rowspanAndColspan = ({ col,row, ,colIndex , rowIndex })
其中 col 是表头信息, row是一行的信息 ,colIndex是单元格列 index, rowIndex是单元格行 index

<script setup lang="jsx">
import { ErrorCircleFilledIcon, CheckCircleFilledIcon, CloseCircleFilledIcon } from 'tdesign-icons-vue-next';const statusNameListMap = {0: { label: '审批通过', theme: 'success', icon: <CheckCircleFilledIcon /> },1: { label: '审批失败', theme: 'danger', icon: <CloseCircleFilledIcon /> },2: { label: '审批过期', theme: 'warning', icon: <ErrorCircleFilledIcon /> },
};const data = new Array(6).fill(null).map((_, i) => ({i,status: i % 3,applicant: ['贾明', '张三', '王芳'][i % 3],channel: ['电子签署', '纸质签署', '纸质签署'][i % 3],type: ['审批通过', '已过期', '审批失败', '审批中'][i % 4],detail: {email: ['w.cezkdudy@lhll.au','r.nmgw@peurezgn.sl','p.cumx@rampblpa.ru','b.nmgw@peurezgn.sl','d.cumx@rampblpa.ru',][i % 5],},needed: ['Y', 'N'][i % 1],description: ['宣传物料制作费用', 'algolia 服务报销', '相关周边制作费', '激励奖品快递费'][i % 4],createTime: '2021-11-01',
}));const columns = [{ colKey: 'applicant', title: '申请人', width: '100' },{colKey: 'status',title: '申请状态',width: '150',cell: (h, { row }) => {return (<t-tag shape="round" theme={statusNameListMap[row.status].theme} variant="light-outline">{statusNameListMap[row.status].icon}{statusNameListMap[row.status].label}</t-tag>);},},{colKey: 'description',title: '审批事项',width: 150,},{colKey: 'detail.email',title: '邮箱地址',},{colKey: 'channel',// 多行表头合并请参考「多级表头示例」title: '其他信息',// 仅适用于单行表头合并列colspan: 2,// 设置列样式,注释的示例代码有效// attrs: ({ type, col, row, colIndex, rowIndex }) => ({// style: {// color: 'blue',// },// }),},{colKey: 'createTime',title: '创建时间',},
];const rowspanAndColspan = ({ col, rowIndex, colIndex }) => {if (colIndex === 0 && rowIndex % 2 === 0) {return {rowspan: 2,};}if (col.colKey === 'description' && rowIndex === 1) {return {colspan: 2,rowspan: 2,};}if (col.colKey === 'email' && rowIndex === 4) {return {colspan: 2,rowspan: 2,};}
};
</script>
打印了下data的结构:发现每个字段都有,是个数组对象,所以合并的时候数据是会占位,并被前面的覆盖掉

难点二:样式修改
官方的样式只提供了表格的样式修改
1. 行的类名rowClassName设置
2. 列的类名className设置
3. attr: { style: { } }设置该列的内联样式
4. cell:表格的渲染函数,可自定义插槽作为该列,比如增加图标
5. title:表头的渲染函数,可自定义插槽作为表头,比如增加图标
6. render:可以渲染表头,也可以渲染单元格,相当于cell或title

官方代码:我这里只放部分对应的
// 第一种 (王芳那一行)
<t-table row-key="id" :data="data" :columns="columns" :row-class-name="getRowClassName"><template #footerSummary><div class="t-table__row-filter-inner"><InfoCircleIcon />近期申请耗时较长</div></template>
</t-table>const getRowClassName = ({ rowIndex }) => {if (rowIndex === 2) return 'custom-third-class-name';return '';
};.t-demo__style .t-table .custom-third-class-name > td {background-color: var(--td-brand-color-light);font-weight: bold;
}// 第二种(第四列)
{colKey: 'channel',title: '签署方式',width: 120,align: 'right',className: () => {return 'custom-cell-class-name';},},.t-table td.custom-cell-class-name {color: orange;font-weight: bold;
}// 第三种 (第三列){colKey: 'time',title: '申请耗时(天)',width: 120,align: 'center',// 设置单元格类名className: ({ row }) => {if (row.time >= 9) {return 'custom-cell-class-name';}return '';},attrs: ({ row }) => {if (row.time >= 9) {return {style: {fontWeight: 600,backgroundColor: 'var(--td-warning-color-light)',},};}},},

<t-table :data="data" :columns="columns" row-key="property" lazy-load><!-- 自定义表头,title值为插槽名称 --><template #title-slot-name><div style="display: flex; align-items: center"><UserCircleIcon style="margin-right: 8px" />申请人</div></template>
</t-table>// cell colums里的 对应审批状态的单元格
{title: '审批状态',colKey: 'status',// 使用 cell 方法自定义单元格:cell: (h, { row }) => {return (<t-tag shape="round" theme={statusNameListMap[row.status].theme} variant="light-outline">{statusNameListMap[row.status].icon}{statusNameListMap[row.status].label}</t-tag>);},},// title 对应有图标的表头
{colKey: 'applicant',title: 'title-slot-name',width: 120,},// render 对应申请时间
{colKey: 'createTime',// render 可以渲染表头,也可以渲染单元格。但 title 只能渲染表头,cell 只能渲染单元格render(h, context) {const { type, row, col } = context;return {title: '申请时间',cell: row && row[col.colKey],}[type];},},
然后以下是我的使用,我的实现结果,贴图:

表格结构定义:
colums: 表头 定义字段,宽度,行合并/列合并,表头对应该列的样式
table:定义表格数据,其中字段对应表头字段,然后可以设置行、列合并(非自带),传给下面函数处理
tableList:由于没设标识,所以给数据增加index作为标识,不然会报错
rowspanAndColspan:函数,设置单元格所占的行,列的格子数,会对满足条件的单元格使用
attrs设置了样式,cell,title绑定了插槽
// 表头 定义字段,宽度,行合并/列合并,表头对应该列的样式
const columns = [{colKey: 'compare',title: '测试1',width: '200px',colspan: 2,attrs: () => {return {style: {fontWeight: 600,},}},},{colKey: 'content',title: '测试2',width: '279px',align: 'center',},{colKey: '测试3',title: 'title-vip',width: '239px',align: 'center',cell: 'vip',attrs: () => {return {style: {backgroundColor: 'rgba(239, 158, 0, 0.1)',border: '1px solid #FFD583',},}},},{colKey: 'normal',title: '测试4',width: '239px',align: 'center',cell: 'normal',},{colKey: 'other',title: '测试5',width: '239px',align: 'center',cell: 'other',},
]// 定义表格数据,其中字段对应表头字段,然后可以设置行、列合并,这里主要是传给下面函数处理
const table = [{compare: '项目',content: '项目',vip: true,normal: 'test',other: false,colspan: 2,}, {compare: '项目',vip: true,normal: 'test',other: '其他',colspan: 2,
}, {compare: '项目',content: '项目',vip: true,normal: true,other: false,rowspan: 4,
}, {compare: '项目',content: '项目',vip: true,normal: true,other: false,
}, {compare: '项目',content: '项目',vip: true,normal: true,other: false,
}, {compare: '项目',content: '企业',vip: true,normal: true,other: false,
}, {compare: '项目测试',content: '',vip: true,normal: true,other: '其他',colspan: 2,
}, {compare: '下载',content: '',vip: true,normal: '其他',other: '其他',colspan: 2,
}, {compare: '项目查看 ',content: '',vip: true,normal: '其他',other: '其他',colspan: 2,
}, {compare: '项目查看',content: '项目1',vip: true,normal: '其他',other: '其他',rowspan: 4,
}, {compare: '项目查看',content: '项目2',vip: true,normal: true,other: false,
}, {compare: '项目查看',content: '项目3',vip: true,normal: true,other: false,
}, {compare: '项目查看',content: '项目4',vip: '测试数据',normal: '其他',other: '其他',
}]// 给数据增加index作为标识,不然会报错
const tableList = table.map((item, index) => ({...item,index,
}))// 这个是设置单元格所占的行,列的格子数
function rowspanAndColspan({ row, colIndex }) {if (colIndex === 0) {const colspan = row.colspan || 1const rowspan = row.rowspan || 1return {colspan,rowspan,}}
}
表格:
<div><t-table:bordered="true":data="tableList":columns="columns"row-key="index":rowspan-and-colspan="rowspanAndColspan":resizable="false"lazy-load><template #title-vip><div class="cell-style font-600"><img src="../../assets/img/vip/icon-vip.png" alt="" class="vipimg cell-img mr-1"> 测试3</div></template><template #vip="{ row }"><div v-if="row.vip === true" class="cell-style"><div class="true cell-img"><img src="../../assets/img/vip/icon-true.png" alt=""></div></div><div v-else>{{ row.vip }}</div></template><template #normal="{ row }"><div v-if="row.normal === true" class="cell-style"><div class="true cell-img"><img src="../../assets/img/vip/icon-true.png" alt=""></div></div><div v-else>{{ row.normal }}</div></template><template #other="{ row }"><div v-if="row.other === false" class="cell-style"><div class="false cell-img"><img src="../../assets/img/vip/icon-false.png" alt=""></div></div><div v-else>{{ row.other }}</div></template></t-table>
</div>
踩坑1:
设置headerAffixedTop的吸顶,会因为表头合并而出现滚动条的问题,升级版本也没办法

解决方法:不能完全解决,只能采取相似效果实现
将表头的colspan:2的合并给去掉,然后把后边的第一个格子设置className,定义样式,左边框去掉
踩坑2:
表头的样式定义:无直接设置表头的样式
1. 使用className设置实现,但是需要设置每一个
2. 使用样式穿透
:deep(.t-table__th-cell-inner) {font-weight: 600;color: black;
}
相关文章:
组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
碎碎念:有点难用,不丝滑(以下介绍的难点不是真的难,只是有点点点难用) 背景:需要实现表格的行列合并以及图标的嵌入,想到使用组件库组件来方便开发 链接:TDesign Web Vue Next 难点…...
jwt在express中token的加密解密实现方法
在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后,今天来详细学习一下token是如何生成的,secret密钥的加密解密过程是怎么样的。 安装依赖 express:用于创建服务器jsonwebtoken:用于生成和验证JWTbody-parser࿱…...
结构体、共用体的字节对齐
结构体 结构体嵌套时:先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节,仍然进行,8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...
【YOLOv3】源码(train.py)
概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…...
帧缓存的分配
帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…...
基于顺序表实现队列循环队列的处理
文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列(校招难度) 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源: 我们的这个队列里面是有9个位置的,我们知道这个队列…...
磁珠选型规范
根据不同的应用场景,磁珠可以分为普通型磁珠,大电流型磁珠和尖峰型磁珠。 (1)普通型磁珠:主要用于电流比较小(小于600mA).无特殊要求的场景,普通型磁珠的直流电阻一般不超过1Ω&…...
linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置
inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...
3DMAX镂空星花球建模插件FloralStarBall使用方法
3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模,再也不用手动做了,使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成! 3DMAX镂空星花球建模插件FloralStarBall,经典星形球体的美丽变体。星形…...
window 安装 nodejs
方式一:使用 fnm 可能会出现 cmd 找不到 nodejs 和 npm 的情况,并且包也可能不知道哪一个 参考链接 Node.js — Download Node.js 使用 powershell 操作,要不然可能有些执行不了 # 安裝 fnm (快速 Node 管理器) winget install Schniz.fnm# …...
Autoware Universe 安装记录
前提: ubuntu20.04,英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本,桌面版 ROS2-dev-tools安装 sudo apt install python3-testresources sudo apt update …...
每天40分玩转Django:Django部署概述
一、Django部署概述 在开发阶段,我们通常使用Django内置的轻量级开发服务器runserver。但在生产环境中,为了应对大量并发请求,需要使用高性能的WSGI服务器,如Gunicorn、uWSGI等。同时还要配置Nginx等Web服务器作为反向代理,实现负载均衡、静态文件处理等。下面是Django部署的整…...
使用VS Code开发ThinkPHP项目
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…...
基于深度可分离卷积的MNIST手势识别
基于深度可分离膨胀卷积的MNIST手写体识别 Github链接 项目背景: MNIST手写体数据集是深度学习领域中一个经典的入门数据集,包含了从0到9的手写数字图像,用于评估不同模型在图像分类任务上的性能。在本项目中,我们通过设计一种基…...
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
安装 1.拉取项目 项目地址: chatgpt-on-wechat 2.安装依赖 pip3 install -r requirements.txt pip3 install -r requirements-optional.txt3、获取API信息 当前免费的有百度的文心一言,讯飞的个人认证提供500万token的额度。 控制台-讯飞开放平台 添加链接描述…...
Word批量更改题注
文章目录 批量更改批量去除空格 在写文章的时候,往往对图片题注有着统一的编码要求,例如以【图 1- xx】。一般会点击【引用】->【插入题注】来插入题注,并且在引用的时候,点击【引用】->【交叉引用】,并且在交叉…...
Springboot配置嵌入式服务器
一.如何定制和修改Servlet容器的相关配置 修改和server有关的配置(ServerProperties); server.port8081 server.context‐path/tx server.tomcat.uri‐encodingUTF‐8 在yml配置文件的写法: server:port: 8081servlet:context-pa…...
正交三角函数全面阐述
目录 1. 正交性定义 2. 正交三角函数 常见的正交三角函数 3. 正交三角函数的特性 4. 正交三角函数在傅里叶分析中的应用 5. 正交三角函数的应用领域 6. 总结 正交三角函数是指在特定条件下,三角函数之间的内积为零。更具体地说,在数学分析、信号处…...
《Vue3 四》Vue 的组件化
组件化:将一个页面拆分成一个个小的功能模块,每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件: Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件…...
linux中,mysql数据库分片(分库分表)
1.mysql分库分表:解决单个mysql存储上限问题1.实现方法:存储层面:利用分布式存储解决方案分库分表:拆分库和表到其它服务器2.常用设计思路:垂直分库(库里面的表分开)水平分表(表里面的数据分开)分库:数据库分为多个,每个数据库里面都有表,数据均匀存储分库分表:在分的每库里面,…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
JS面试常见问题——数据类型篇
这几周在进行系统的复习,这一篇来说一下自己复习的JS数据结构的常见面试题中比较重要的一部分 文章目录 一、JavaScript有哪些数据类型二、数据类型检测的方法1. typeof2. instanceof3. constructor4. Object.prototype.toString.call()5. type null会被判断为Obje…...
[学习笔记]使用git rebase做分支差异化同步
在一个.NET 项目中,使用了Volo.Abp库,但出于某种原因,需要源码调试,因此,使用源码方式集成的项目做了一个分支archive-abp-source 其中引用方式变更操作的提交为:7de53907 后续,在master分支中…...
DeepSeek11-Ollama + Open WebUI 搭建本地 RAG 知识库全流程指南
🛠️ Ollama Open WebUI 搭建本地 RAG 知识库全流程指南 💻 一、环境准备 # 1. 安装 Docker 和 Docker Compose sudo apt update && sudo apt install docker.io docker-compose -y# 2. 添加用户到 docker 组(避免 sudo 权限&…...
