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

VUE a-table 动态拖动修改列宽+固定列

实现效果

请添加图片描述

实现思路

  1. 自定义表头,在标题后面加两个标签,分别用来显示拖拽图标(cursor: col-resize),和蓝色标记线(有的时候鼠标移动过程中不一定会在表内,这个时候不显示图标,只显示蓝色标记线)
  2. 给所有列增加一个初始宽度,表格 scroll 的 x 设置为100%
  3. 点击拖拽图标后:显示对应的蓝色标记线,监听鼠标的移动和释放
  4. 鼠标移动的时候同步更新列宽
  5. 鼠标释放的时候移除监听

实现代码

html

<a-table:scroll="{ x: '100%' }":columns="columns":data-source="dataSource"
><template #headerCell="{ column }"><div class="resizable-header">{{ column.title }}<span class="resizer" @mousedown="(e) => onMouseDown(e, column)"></span><span v-if="isResizing && resizingColumnKey === column.key" class="resizer-line"></span></div></template>
</a-table>

ts

const columns = ref<Array<any>>([]);
const isResizing = ref(false);
const resizingColumnKey = ref<string>('');// 设置列字段,列宽、固定列
watch(() => headerColumns.value,() => {columns.value = headerColumns.value.map((obj: HeaderColumns) => {if (item.name === 'code') {obj = { ...obj, width: 150, fixed: true };} else if (item.name === 'seq') {obj = { ...obj, width: 50, fixed: true };} else if (item.name === 'operation') {delete obj.ellipsis;obj = { ...obj, width: 200, fixed: 'right' };} else {obj = { ...obj, width: (obj.title || '').length * 15 + 18 };}return obj;});},{immediate: true,deep: true,},
);// 点击拖拽设置列宽
const onMouseDown = (event: MouseEvent, column: any) => {const startX = event.clientX; // 获取鼠标初始位置const startWidth = column.width || 0; // 获取初始宽度isResizing.value = true;resizingColumnKey.value = column.key;const mouseMoveHandler = (e: MouseEvent) => {if (!isResizing.value || !resizingColumnKey.value) return;const newWidth = Math.max(50, parseFloat(`${startWidth}`) + (e.clientX - startX)); // 计算新的宽度column.width = newWidth; // 更新列宽};const mouseUpHandler = () => {isResizing.value = false;resizingColumnKey.value = '';document.removeEventListener('mousemove', mouseMoveHandler);document.removeEventListener('mouseup', mouseUpHandler);};document.addEventListener('mousemove', mouseMoveHandler);document.addEventListener('mouseup', mouseUpHandler);
};

css

:deep(.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content) {overflow: visible;
}.resizable-header {position: relative;display: flex;align-items: center;.resizer {position: absolute;top: 0;right: -12px;z-index: 1;width: 8px;height: 100%;cursor: col-resize;}.resizer-line {position: absolute;top: -8px;right: -8px;bottom: -8px;width: 1px;background-color: #3388FF;}
}

相关文章:

  • Unity XR 环境检测
  • Trimble隧道测量软件为您解锁新深度
  • 车视界系统小程序的设计
  • 【DCGAN 生成漫画头像】
  • 检查一个CentOS服务器的配置的常用命令
  • Android常用C++特性之std::none_of
  • springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
  • 【云原生安全篇】Cosign助力Harbor验证镜像实践
  • Qt | Linux+QFileSystemWatcher文件夹和文件监视(例如监视U盘挂载目录)
  • react项目中引入最新版本eslint
  • 使用iTextPDF库时,设置文字为中文格式
  • Hadoop集群的高可用(HA):NameNode和resourcemanager高可用的搭建
  • 基于Springboot+Vue的基于协同过滤算法的个性化音乐推荐系统 (含源码数据库)
  • Java高效编程(7):消除过时的对象引用
  • ue4多个面重叠闪烁
  • 07.Android之多媒体问题
  • angular2开源库收集
  • HashMap剖析之内部结构
  • jdbc就是这么简单
  • JS函数式编程 数组部分风格 ES6版
  • Nodejs和JavaWeb协助开发
  • PermissionScope Swift4 兼容问题
  • SpringBoot几种定时任务的实现方式
  • vue-loader 源码解析系列之 selector
  • 大快搜索数据爬虫技术实例安装教学篇
  • 服务器从安装到部署全过程(二)
  • 机器学习 vs. 深度学习
  • 王永庆:技术创新改变教育未来
  • 微信开放平台全网发布【失败】的几点排查方法
  • 为什么要用IPython/Jupyter?
  • 我的业余项目总结
  • 异步
  • 译米田引理
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​渐进式Web应用PWA的未来
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #《AI中文版》V3 第 1 章 概述
  • #Linux(权限管理)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13):Silverlight 2 数据与通信之WebRequest
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (笔试题)分解质因式
  • (分布式缓存)Redis哨兵
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (南京观海微电子)——示波器使用介绍
  • (正则)提取页面里的img标签
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Net 6.0 监听Windows网络状态切换
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?