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

组件库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>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑

碎碎念&#xff1a;有点难用&#xff0c;不丝滑&#xff08;以下介绍的难点不是真的难&#xff0c;只是有点点点难用&#xff09; 背景&#xff1a;需要实现表格的行列合并以及图标的嵌入&#xff0c;想到使用组件库组件来方便开发 链接&#xff1a;TDesign Web Vue Next 难点…...

jwt在express中token的加密解密实现方法

在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后&#xff0c;今天来详细学习一下token是如何生成的&#xff0c;secret密钥的加密解密过程是怎么样的。 安装依赖 express&#xff1a;用于创建服务器jsonwebtoken&#xff1a;用于生成和验证JWTbody-parser&#xff1…...

结构体、共用体的字节对齐

结构体 结构体嵌套时&#xff1a;先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节&#xff0c;仍然进行&#xff0c;8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能&#xff1a;解析命令行参数&#xff0c;设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能&#xff1a;初始化日志记录器&#xff0c;配置监控系统项目经理使用监控和记录工具&#xff0c;实时跟踪施工进度和质量…...

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存&#xff0c;使用的是一个叫 ION 的内核模块&#xff0c;App 使用 ioctl 系统调用后&#xff0c;会在内核内存中分配一块符合要求的内存&#xff0c;用户态会拿到一个 fd&#xff08;有的地方也称之为 handle&…...

基于顺序表实现队列循环队列的处理

文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列&#xff08;校招难度&#xff09; 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源&#xff1a; 我们的这个队列里面是有9个位置的&#xff0c;我们知道这个队列…...

磁珠选型规范

根据不同的应用场景&#xff0c;磁珠可以分为普通型磁珠&#xff0c;大电流型磁珠和尖峰型磁珠。 &#xff08;1&#xff09;普通型磁珠&#xff1a;主要用于电流比较小&#xff08;小于600mA&#xff09;.无特殊要求的场景&#xff0c;普通型磁珠的直流电阻一般不超过1Ω&…...

linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置

inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...

3DMAX镂空星花球建模插件FloralStarBall使用方法

3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模&#xff0c;再也不用手动做了&#xff0c;使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成&#xff01; 3DMAX镂空星花球建模插件FloralStarBall&#xff0c;经典星形球体的美丽变体。星形…...

window 安装 nodejs

方式一&#xff1a;使用 fnm 可能会出现 cmd 找不到 nodejs 和 npm 的情况&#xff0c;并且包也可能不知道哪一个 参考链接 Node.js — Download Node.js 使用 powershell 操作&#xff0c;要不然可能有些执行不了 # 安裝 fnm (快速 Node 管理器) winget install Schniz.fnm# …...

Autoware Universe 安装记录

前提&#xff1a; ubuntu20.04&#xff0c;英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本&#xff0c;桌面版 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 常用的集成开发环境&#xff08;IDE&#xff09;包括P…...

基于深度可分离卷积的MNIST手势识别

基于深度可分离膨胀卷积的MNIST手写体识别 Github链接 项目背景&#xff1a; MNIST手写体数据集是深度学习领域中一个经典的入门数据集&#xff0c;包含了从0到9的手写数字图像&#xff0c;用于评估不同模型在图像分类任务上的性能。在本项目中&#xff0c;我们通过设计一种基…...

Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人

安装 1.拉取项目 项目地址: chatgpt-on-wechat 2.安装依赖 pip3 install -r requirements.txt pip3 install -r requirements-optional.txt3、获取API信息 当前免费的有百度的文心一言&#xff0c;讯飞的个人认证提供500万token的额度。 控制台-讯飞开放平台 添加链接描述…...

Word批量更改题注

文章目录 批量更改批量去除空格 在写文章的时候&#xff0c;往往对图片题注有着统一的编码要求&#xff0c;例如以【图 1- xx】。一般会点击【引用】->【插入题注】来插入题注&#xff0c;并且在引用的时候&#xff0c;点击【引用】->【交叉引用】&#xff0c;并且在交叉…...

Springboot配置嵌入式服务器

一.如何定制和修改Servlet容器的相关配置 修改和server有关的配置&#xff08;ServerProperties&#xff09;&#xff1b; server.port8081 server.context‐path/tx server.tomcat.uri‐encodingUTF‐8 在yml配置文件的写法&#xff1a; server:port: 8081servlet:context-pa…...

正交三角函数全面阐述

目录 1. 正交性定义 2. 正交三角函数 常见的正交三角函数 3. 正交三角函数的特性 4. 正交三角函数在傅里叶分析中的应用 5. 正交三角函数的应用领域 6. 总结 正交三角函数是指在特定条件下&#xff0c;三角函数之间的内积为零。更具体地说&#xff0c;在数学分析、信号处…...

《Vue3 四》Vue 的组件化

组件化&#xff1a;将一个页面拆分成一个个小的功能模块&#xff0c;每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件&#xff1a; Vue.createApp() 中传入对象的本质上就是一个组件&#xff0c;称之为根组件&#xff08;APP 组件…...

linux中,mysql数据库分片(分库分表)

1.mysql分库分表:解决单个mysql存储上限问题1.实现方法:存储层面:利用分布式存储解决方案分库分表:拆分库和表到其它服务器2.常用设计思路:垂直分库(库里面的表分开)水平分表(表里面的数据分开)分库:数据库分为多个,每个数据库里面都有表,数据均匀存储分库分表:在分的每库里面,…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...