当前位置: 首页 > 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”…...

别再为嵌入式设备大内存发愁了!手把手教你用CMA(连续内存分配器)搞定Linux视频编解码缓冲区

嵌入式多媒体开发中的连续内存优化实战&#xff1a;CMA技术深度解析 在嵌入式多媒体开发领域&#xff0c;视频编解码、图像处理等任务对内存管理提出了严苛要求。当你在树莓派上部署视频监控系统&#xff0c;或在工业摄像头中实现实时H.264编码时&#xff0c;是否经常遇到这样的…...

保姆级教程:INCA 7.2.3 从新建工程到观测标定的完整流程(附A2L文件处理技巧)

INCA 7.2.3 全流程实战指南&#xff1a;从工程搭建到参数标定的深度解析 在汽车电子开发领域&#xff0c;标定工具链的掌握程度直接影响开发效率。作为行业标准的INCA软件&#xff0c;其7.2.3版本在工程管理、实时观测和参数标定方面提供了更完善的解决方案。本文将采用"操…...

Windows鼠标指针主题定制:从.cur/.ani文件到个性化交互体验

1. 项目概述&#xff1a;一个为Windows终端注入灵魂的鼠标指针主题如果你和我一样&#xff0c;每天有超过8小时的时间是与Windows操作系统相伴的&#xff0c;那么你对那个千篇一律的白色箭头鼠标指针&#xff0c;恐怕早已感到审美疲劳。它就像一个沉默的、功能性的背景板&#…...

5分钟终极指南:在Blender中完美导入Rhino 3dm文件的完整教程

5分钟终极指南&#xff1a;在Blender中完美导入Rhino 3dm文件的完整教程 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否正在寻找一种简单、快速且免费的方法&#xff0c…...

一个产业带还值不值得押注?用 4 个生命周期阶段,对照 4 类可观察指标自己判断

你是卖设备、卖材料、卖工业服务的上游销售员。摆在你面前的是一张产业带地图&#xff1a;古镇灯饰、晋江运动鞋、戴南不锈钢、盛泽化纤、安平丝网……每一个都聚着成千上万家工厂。 问题来了&#xff1a;要在哪个产业带投入你的差旅、样品、地推团队&#xff1f;押错地方&…...

CircuitPython HID设备模拟:从键盘鼠标到数据记录实战指南

1. 项目概述&#xff1a;从微控制器到智能交互设备在嵌入式开发的世界里&#xff0c;让一块小小的开发板“假装”成键盘或鼠标&#xff0c;直接控制你的电脑&#xff0c;这听起来像是极客的魔法&#xff0c;但其实是基于一个非常成熟且标准化的协议&#xff1a;HID。HID&#x…...

深入解析Ayiks project-genesis-framework:模块化架构元框架的设计与实践

1. 项目概述与核心价值最近在梳理一些老项目的技术债&#xff0c;发现很多早期为了快速上线而写的代码&#xff0c;现在维护起来简直是一场灾难。业务逻辑和底层框架耦合得死死的&#xff0c;想换个数据库或者加个缓存层&#xff0c;都得把整个项目翻个底朝天。这种时候&#x…...

从DFT计算到论文插图:一条龙搞定Pt(111)表面吸附模型的构建与可视化

从DFT计算到论文插图&#xff1a;Pt(111)表面吸附模型的完整构建与可视化指南 在计算材料科学领域&#xff0c;构建精确的表面吸附模型是研究催化反应机理、表面化学过程的第一步。对于刚入门的研究者来说&#xff0c;如何快速构建一个符合物理实际的Pt(111)表面吸附模型&#…...

终极M3U8视频下载神器:3步搞定加密流媒体!

终极M3U8视频下载神器&#xff1a;3步搞定加密流媒体&#xff01; 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-do…...

Nuxt.js Tailwind CSS 模块:零配置快速启动现代Web开发

Nuxt.js Tailwind CSS 模块&#xff1a;零配置快速启动现代Web开发 【免费下载链接】tailwindcss Tailwind CSS module for Nuxt 项目地址: https://gitcode.com/gh_mirrors/tai/tailwindcss Nuxt.js Tailwind CSS 模块是一个专为Nuxt框架设计的Tailwind CSS集成解决方案…...