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

antd table列选中效果实现

前言

开发中有一个需要呈现不同时间点各个气象要素的值需求,我觉得一个table可以实现这类数据的展示,只是因为时间点时关注的重点,所以需要列选中效果,清晰的展示时间点下的要素数据。我选择的是antd的table组件,这个组件没有列选中的效果,所以还是需要自己动手丰衣足食,改造一下。

分析

这个功能的难点在于列选中效果,我们需要给他一个背景加上边框,虽然antd的table没有列选中效果,但是它提供了customCell,customHeaderCell,我们可以根据这些回调函数的特点灵活使用实现列选中效果。

参数说明类型用途
customCell设置单元格属性Function(record, rowIndex)根据activeColIndex参数,为选中列包含的单元格添加class,并且为最后一个单元格加上“lastCol”的class,因为最后一个需要加上下边框
customHeaderCell设置头部单元格属性Function(column)主要为选中列的第一个单元格加上class,因为表头单元格需要加上上边框

源代码

/**
* CustomTable.vue
* @Author ZhangJun
* @Date  2024/5/28 11:39
**/
<template><a-spin :spinning="loading"><template v-if="dataSource&&dataSource.length>0"><a-table :pagination="false":columns="getColumns":dataSource="dataSource"rowKey="itemCode":scroll="{y:dataSource.length>9?'280px':false}"></a-table></template><custom-empty v-elsedesc="暂无机场高影响数据"sub-title="NO DATA IS AVAILABLE"style="margin: 8% auto;"></custom-empty></a-spin>
</template><script>
import CustomEmpty from "@/components/CustomEmpty.vue";
import moment from "moment";
import {HighImpactWeatherApi} from "@/api/HighImpactWeatherApi";
import WizStyleHelper from "@/utils/leaflet/WizStyleHelper";
import BigNumber from "bignumber.js";export default {name: "CustomTable",components: {CustomEmpty},props: {currentDateTime: {type: String},//选择的可显示的要素visibleItemsConfig: {type: Array, default: () => ([])},airportId: {type: String}},data() {return {loading: false,itemDefaultConfig: {visibility: {unit: 'm', name: '能见度'},wins: {unit: 'm/s', name: '风'},rain: {unit: 'mm', name: '雨'},lowTemperature: {unit: '℃', name: '低温'},},itemColors: {},//要素配色缓存dataSource: [],activeColIndex: -1,//现在选中的列}},computed: {/*** 动态获取表格的columns* @returns {*[]}*/getColumns() {//获取各种要素的颜色let colors = this.visibleItemsConfig?.map(({styleCode}) => {return [styleCode, this.getItemColor(styleCode)];}) || [];this.itemColors = Object.fromEntries(colors);//要素名称列自定义let itemCodeCustomRender = (text) => {let {styleCode, pCode, name} = this.visibleItemsConfig?.find(({code}) => code === text);let unit = this.itemDefaultConfig?.[pCode]?.unit || '';let color = this.itemColors?.[styleCode];return <div class="flex justify-end" style="width:80px;">{name}<div style={{padding: '0 4px', color}}>{unit}</div></div>};let dayDate = moment(this.currentDateTime, 'YYYYMMDDHHmmss');let columns_temp = [];for (let i = 0; i < 24; i++) {let dataIndex = dayDate.clone().add(i, 'hour');columns_temp = [...columns_temp, {align: 'center',title: dataIndex.format('HH:mm'),dataIndex: dataIndex.format('YYYYMMDDHH'),key: dataIndex.format('YYYYMMDDHH'),className: 'customCell',//为了实现列选中高亮效果customCell: (record, rowIndex) => {return {class: {activeCol: i === this.activeColIndex,//如果该cell所以选中的那一列中,就在上这个样式lastCol: rowIndex === this.dataSource.length - 1//如果该cell属于选中列的最后一个cell,就加上这个样式,因为要在这个cell加上下边框},on: {mouseenter: (e) => {//赋值当前cell所在的列索引,为高亮列做准备this.activeColIndex = i;},mouseleave: (event) => {//清空this.activeColIndex = -1;}}}},//头部需要加上上边框customHeaderCell: (column) => {//自定义表头return {class: {activeCol: i === this.activeColIndex,//该表头为选中列的表头,加上这个样式,因为列头需要加上边框headerCell: true},}},customRender: (text, record) => {text = Number(text);if (text >= 1000) {text = new BigNumber(text).toFixed(0);} else if (text < 1000 && text >= 100) {text = new BigNumber(text).toFixed(0);} else if (text < 100 && text >= 10) {text = new BigNumber(text).toFixed(1);} else if (text < 10 && text > 0) {text = new BigNumber(text).toFixed(2);}let {itemCode} = record;let {styleCode, legendImage, name, pCode} = this.visibleItemsConfig?.find(({code}) => code === itemCode);let unit = this.itemDefaultConfig?.[pCode]?.unit || '';//如果有图标就显示图标if (legendImage) {if (text > 0) {return <img height="15" title={`${name}${text} ${unit}`} src={legendImage} alt={name}/>;}return <div style={{padding: '4px 0',overflow: 'hidden',width: '28px',textAlign: 'center',cursor: 'default',}} title={`${name}${text} ${unit}`}>-</div>}let color = this.itemColors?.[styleCode];return <div style={{background: text > 0 ? color : '',padding: '4px 0',overflow: 'hidden',width: '28px',textAlign: 'center',cursor: 'default',}} title={`${name}${text} ${unit}`}>{text}</div>;}}];}return [{title: '',dataIndex: 'itemCode',key: 'itemCode',className: 'customCell',align: 'right',width: 80,customRender: itemCodeCustomRender,}, ...columns_temp];},},methods: {/*** 获取数据*/fetchData() {if (this.currentDateTime && this.visibleItemsConfig?.length > 0 && this.airportId) {let startTime = moment(this.currentDateTime, 'YYYYMMDDHH').format('YYYYMMDDHH');let endTime = moment(this.currentDateTime, 'YYYYMMDDHH').add(23, 'hour').format('YYYYMMDDHH');let itemCodes = this.visibleItemsConfig?.map(({code}) => code).join(',');this.loading = true;HighImpactWeatherApi.getHighImpactSingleAirportFutureImpactInfo({startTime,// 2024051102,endTime,itemCodes,airportId: this.airportId}).then((res = {}) => {let {data} = res;if (data) {this.dataSource = itemCodes.split(',').map(itemCode => {return {itemCode, ...data[itemCode]};});}}, () => {this.dataSource = [];}).finally(() => {this.loading = false;});}},/*** 获取站点图例颜色* @param styleCode 配色code*/getItemColor(styleCode) {if (styleCode) {const wizStyleHelper = new WizStyleHelper();const colorConfig = wizStyleHelper.getStyleImpl(styleCode);let {colors: [, color]} = colorHelper.getColorImpl(colorConfig.shaded.color).colorPalettes;return `rgba(${color.join(',')})`;}return undefined},},mounted() {this.fetchData();this.$watch(() => [this.currentDateTime, this.airportId, this.visibleItemsConfig], ([params1, params2, params3]) => {this.fetchData();});}
}
</script><style scoped lang="less">
/deep/ .customCell {background: transparent;padding: 4px 0 !important;border-color: transparent;border-width: 0 1px 0 1px;* {font-family: D-DIN, sans-serif;font-size: 12px;font-weight: normal;line-height: 12px;text-align: center;letter-spacing: 0;color: rgba(255, 255, 255, 0.6);white-space: nowrap;}
}/deep/ .customRow {> td {font-family: D-DIN, sans-serif;font-size: 12px;font-weight: normal;line-height: normal;text-align: center;letter-spacing: 0;color: white;}
}/deep/ .ant-table-header {background: transparent;&.ant-table-hide-scrollbar {margin-right: -0.69rem;}
}/deep/ .ant-table-body {background: transparent !important;&::-webkit-scrollbar {/* 对应纵向滚动条的宽度 */width: 0.425rem;/* 对应横向滚动条的宽度 */height: 0.425rem;}&::-webkit-scrollbar-thumb {background: #198CF8;border-radius: 32px;}&::-webkit-scrollbar-track {background: rgba(7, 28, 65, 0.5);border-radius: 32px;}.ant-table-tbody {> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {background: unset;}}
}/deep/ .headerCell {border-width: 1px 1px 0;border-style: solid;border-color: transparent;
}/deep/ .lastCol {border-width: 0 1px 1px;border-style: solid;border-color: transparent;
}/deep/ .activeCol {background: rgba(77, 136, 255, 0.19) !important;//border-width: 0 1px 0 1px;border-style: solid;border-color: #5FACFF;&.headerCell {border-radius: 2px 2px 0 0;}&.lastCol {border-radius: 0 0 2px 2px;}
}
</style>

效果

相关文章:

antd table列选中效果实现

前言 开发中有一个需要呈现不同时间点各个气象要素的值需求&#xff0c;我觉得一个table可以实现这类数据的展示&#xff0c;只是因为时间点时关注的重点&#xff0c;所以需要列选中效果&#xff0c;清晰的展示时间点下的要素数据。我选择的是antd的table组件&#xff0c;这个…...

Golang实现文件复制

方法&#xff1a;三种 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy进行文件的复制&#xff0c;同时也会复制文件的所有权限 // param src 复制文件 // param des 目标文件 // return error 错误信息 func CopyFile(s…...

探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)

文章目录 文章导图Spring封装的几种线程池SpringBoot默认线程池TaskExecutionAutoConfiguration&#xff08;SpringBoot 2.1后&#xff09;主要作用优势使用场景如果没有它 2.1版本以后如何查看参数方式一&#xff1a;通过Async注解--采用ThreadPoolTaskExecutordetermineAsync…...

kubernetes(Jenkins、kubernetes核心、K8s实战-KubeSphere、)

文章目录 1. Jenkins1.1. 概述1.1.1. 简单部署1.1.2. 自动化部署1.1.3. DevOps概述1.1.4. CI/CD概述 1.2. jenkins介绍及安装1.2.1. 安装1.2.2. 解锁jenkins1.2.3. 安装推荐插件1.2.4. 创建管理员用户1.2.5. 升级jenkins版本1.2.6. 安装额外插件blue ocean1.2.7. jenkins界面说…...

国际数字影像产业园|科技与文创产品创意集市,共筑创新文化新高地

5月29日&#xff0c;为进一步增强园区与企业之间粘性&#xff0c;不断激发企业的创新活力&#xff0c;园区举办了“数媒大厦科技与文创产品创意集市活动”。本次活动由成都树莓信息技术有限公司主办&#xff0c;成都目莓商业管理有限公司、树莓科技&#xff08;成都&#xff09…...

leetcode-55 跳跃游戏

leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人&#xff0c;从第一个下标开始&#xff0c;每次经过一个位置&#xff0c;我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…...

Vue——计算属性 computed 与方法 methods 区别探究

文章目录 前言计算属性的由来方法实现 计算属性 同样的效果计算属性缓存 vs 方法 前言 在官方文档中&#xff0c;给出了计算属性的说明与用途&#xff0c;也讲述了计算属性与方法的区别点。本篇博客只做自己的探究记录&#xff0c;以官方文档为准。 vue 计算属性 官方文档 …...

Java中的ORM框架——myBatis

一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象&#xff0c;Relational表示的是关系型数据库&#xff0c;Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系&#xff0c;这样就可以用面向对象的方式&#xff0c…...

vue2生命周期和计算属性

vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…...

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发

一、概念 MapReduce是一个 分布式运算程序 的编程框架&#xff0c;是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 &#xff0c;并发运行在一个 Hadoop集群上。 1、M…...

centos8stream 编译安装 php-rabbit-mq模块

官方GitHub&#xff1a;https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…...

「异步魔法:Python数据库交互的革命」(二)

哈喽&#xff0c;我是阿佑&#xff0c;上篇文章带领了大家跨入的异步魔法的大门——Python数据库交互&#xff0c;一场魔法与技术的奇幻之旅&#xff01; 从基础概念到DB-API&#xff0c;再到ORM的高级魔法&#xff0c;我们一步步揭开了数据库操作的神秘面纱。SQLAlchemy和Djan…...

php正则中的i,m,s,x,e分别表示什么

正则表达式模式修饰符&#xff08;也称为标志或模式修饰符&#xff09;用于改变正则表达式的行为。这些修饰符可以附加在正则表达式的定界符之后&#xff0c;通常为正斜杠&#xff08;/&#xff09;或井号&#xff08;#&#xff09;&#xff0c;以改变搜索或替换的方式。 1、i…...

最新!2023年台湾10米DEM地形瓦片数据

上次更新谷歌倾斜摄影转换生成OSGB瓦片V1.1版本&#xff0c;使用该版本生产了台北、台中、桃园三个地方的倾斜摄影OSGB数据&#xff0c;在OSGB可视化软件中进行展示&#xff0c;可视化效果和加载效率俱佳。已经很久没更新地形瓦片数据&#xff0c;主要是热点地区的原始数据没有…...

网络学习(11) |深入解析客户端缓存与服务器缓存:HTTP缓存控制头字段及优化实践

文章目录 客户端缓存与服务器缓存的区别客户端缓存浏览器缓存应用程序缓存优点缺点 服务器缓存优点缺点 HTTP缓存控制头字段Cache-ControlExpiresLast-ModifiedETag 缓存策略的优化与实践经验分享1. 使用合适的缓存头字段2. 结合使用Last-Modified和ETag3. 利用CDN进行缓存4. 实…...

uniapp中二次封装jssdk和使用

直接上代码 // import wx from "weixin-js-sdk"; /*** 考虑到包的大小&#xff0c;所以直接在 index.html 文件中cdn引入了jssdk* <script src"https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>* 注意&#xff1a;这里 jWeixin 一…...

只刷题可以通过PMP考试吗?

咱们都知道&#xff0c;PMBOK那本书&#xff0c;哎呀&#xff0c;读起来确实有点费劲。所以&#xff0c;有些人就想了&#xff0c;干脆我就刷题吧&#xff0c;题海战术&#xff0c;没准儿也能过。这话啊&#xff0c;听起来似乎有点道理&#xff0c;但咱们得好好琢磨琢磨。 刷题…...

Python Selenium 详解:实现高效的UI自动化测试

落日余辉&#xff0c;深情不及久伴。大家好&#xff0c;在当今软件开发的世界中&#xff0c;自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中&#xff0c;UI自动化测试是不可或缺的一部分&#xff0c;它可以帮助测试团队快速验证用户界面的正确性…...

npm获取yarn在安装依赖时 git://github.com/user/xx.git 无法访问解决方法 -- 使用 insteadOf设置git命令别名

今天在使用一个node项目时突然遇到 一个github的拉取异常&#xff0c;一看协议居然是git://xxx 貌似github早就不用这种格式了&#xff0c; 而是使用的gitgithub.com:xxx 这种或者https协议&#xff0c;解决方法&#xff1a; 使用insteadof设置git别名 url.<base>.inste…...

Centos7网络故障,开机之后连不上网ens33mtu 1500 qdisc noop state DOWN group default qlen 1000

说明 这是Linux系统网络接口的信息&#xff0c;其中"mtu 1500"表示最大传输单元大小为1500字节&#xff0c;“qdisc noop”表示没有设置特殊的队列算法&#xff0c;“state down”表示该接口当前处于关闭状态&#xff0c;“group default”表示该接口属于“default”…...

分析 Base64 编码和 URL 安全 Base64 编码

前言 在处理数据传输和存储时&#xff0c;Base64 编码是一种非常常见的技术。它可以将二进制数据转换为文本格式&#xff0c;便于在文本环境中传输和处理。Go 语言提供了对标准 Base64 编码和 URL 安全 Base64 编码的支持。本文将通过一个示例代码&#xff0c;来分析这两种编码…...

cocos 屏幕点击坐标转换为节点坐标

let scPos event.getLocation(); let camera find(Canvas/Camera).getComponent(Camera).screenToWorld(new Vec3(scPos.x,scPos.y,0));//摄像机 let p this.node.getComponent(UITransform).convertToNodeSpaceAR(camera);//this.node为指定的节点为原点&#xff08;0,0&…...

电瓶车进电梯识别报警摄像机

随着电动车的普及&#xff0c;越来越多的人选择电动车作为出行工具。在诸多场景中&#xff0c;电梯作为一种常见的交通工具&#xff0c;也受到了电动车用户的青睐。然而&#xff0c;电动车进入电梯时存在一些安全隐患&#xff0c;为了提高电动车进电梯的安全性&#xff0c;可以…...

数据库到服务器提权

数据库提权流程&#xff1a; 1、先获取到数据库用户密码 -网站存在SQL注入漏洞 -数据库的存储文件或备份文件 -网站应用源码中的数据库配置文件 -采用工具或脚本爆破(需解决外联问题) 2、利用数据库提权项目进行连接 MDUT //jkd1.8 启动 Databasetools …...

【MySQL精通之路】InnoDB(9)-表和页压缩(1)-表压缩

目录 1.表压缩概述 2.创建压缩表 2.1 在FPT表空间中创建压缩表 2.2 在通用表空间中创建压缩表 2.3 压缩表的限制 3.优化InnoDB表的压缩 4.运行时监控InnoDB表压缩 5.InnoDB表的压缩工作原理 5.1 压缩算法 5.2 InnoDB数据存储和压缩 5.3 B树页面的压缩 5.4 压缩BLOB、…...

【前端】vue+element项目中select下拉框label想要显示多个值多个字段

Vue Element项目中select下拉框label想要显示多个值 <el-selectv-model"form.plantId"collapse-tagsfilterableplaceholder"请选择品种种类"style"width: 270px;"><el-optionv-for"item in plantIdArray":key"item.id&…...

橙派探险记:开箱香橙派 AIpro 与疲劳驾驶检测的奇幻之旅

目录 引子&#xff1a;神秘包裹的到来 第一章&#xff1a;香橙派AIpro初体验 资源与性能介绍 系统烧录 Linux 镜像&#xff08;TF 卡&#xff09; 调试模式 登录模式 第二章&#xff1a;大胆的项目构想 系统架构设计 香橙派 AIpro 在项目中的重要作用 第三章&#xf…...

云计算期末复习(1)

云计算基础 作业&#xff08;问答题&#xff09; &#xff08;1&#xff09;总结云计算的特点。 透明的云端计算服务 “无限”多的计算资源&#xff0c;提供强大的计算能力 按需分配&#xff0c;弹性伸缩&#xff0c;取用方便&#xff0c;成本低廉资源共享&#xff0c;降低企…...

frp转发服务

将内网服务转发到外网&#xff0c;我准备了一台阿里云ubuntu22.04服务器&#xff0c;两台内网ubuntu22.04服务器 下载frpc和frps以及配置文件 链接: https://pan.baidu.com/s/1auvcWWnyfpYPYatYhHFYag?pwdqkgh 提取码: qkgh 复制这段内容后打开百度网盘手机App&#xff0c;操作…...

【主流分布式算法总结】

文章目录 分布式常见的问题常见的分布式算法Raft算法概念Raft的实现 ZAB算法Paxos算法 分布式常见的问题 分布式场景下困扰我们的3个核心问题&#xff08;CAP&#xff09;&#xff1a;一致性、可用性、分区容错性。 1、一致性&#xff08;Consistency&#xff09;&#xff1a;…...