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

Vue3+Element Plus+Sortable.js:构建可定制化表格拖拽配置中心

1. 为什么需要表格拖拽配置中心后台管理系统中最常见的需求之一就是表格展示数据。但不同用户对表格的展示需求往往不同产品经理可能更关注日期和状态字段运营人员则更看重用户行为和转化数据。传统解决方案是开发多个固定表格页面但这会导致代码冗余和维护困难。我在最近的项目中就遇到了这个问题。客户要求为不同角色的管理员提供个性化的表格视图允许他们自由调整列顺序、隐藏非必要字段。最初尝试用多个v-if判断来实现结果代码迅速膨胀到难以维护的程度。后来发现结合Vue3的响应式特性和Sortable.js的拖拽能力可以优雅地实现这个需求。这个方案的核心优势在于用户友好拖拽操作符合直觉无需复杂教学配置可视化调整效果实时预览避免反复提交测试代码复用封装成独立组件后全系统表格都可接入状态持久化配置可保存到本地或服务端下次访问自动应用2. 环境搭建与基础配置2.1 初始化Vue3项目推荐使用Vite创建项目速度更快、配置更简单npm create vitelatest drag-config-center --template vue-ts cd drag-config-center npm install2.2 安装必要依赖除了Sortable.js我们还需要Element Plus作为UI基础npm install element-plus sortablejs npm install -D types/sortablejs # TypeScript类型支持在main.ts中全局引入Element Plusimport { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vue const app createApp(App) app.use(ElementPlus) app.mount(#app)2.3 项目结构设计建议采用如下组件结构/src /components TableConfigCenter.vue # 配置中心核心组件 PreviewTable.vue # 实时预览组件 /hooks useSortable.ts # 拖拽逻辑封装 /types table.ts # 类型定义3. 核心实现逻辑详解3.1 状态管理设计使用reactive管理所有表格状态这是实现响应式的关键interface TableColumn { label: string prop: string visible?: boolean } interface TableConfigState { availableColumns: TableColumn[] // 所有可用列 activeColumns: TableColumn[] // 当前显示的列 tableData: any[] // 表格数据 hiddenIds: string[] // 隐藏的行ID } const state reactiveTableConfigState({ availableColumns: [ { label: 日期, prop: date, visible: true }, { label: 姓名, prop: name, visible: true }, { label: 地址, prop: address, visible: true }, { label: 状态, prop: status, visible: false } ], activeColumns: [], tableData: [], hiddenIds: [] })3.2 拖拽功能封装在useSortable.ts中封装可复用的拖拽逻辑import Sortable from sortablejs import { Ref } from vue export function useColumnSortable(elRef: RefHTMLElement, list: Refany[]) { let sortable: Sortable onMounted(() { sortable Sortable.create(elRef.value, { animation: 150, handle: .drag-handle, // 拖拽手柄 onEnd: (evt) { const { oldIndex, newIndex } evt if (oldIndex ! newIndex) { const newList [...list.value] const [removed] newList.splice(oldIndex, 1) newList.splice(newIndex, 0, removed) list.value newList } } }) }) onUnmounted(() { sortable?.destroy() }) }3.3 实时同步机制在配置中心组件中实现双向绑定// 监听列变化 watch(() [...state.activeColumns], (newVal) { emit(columns-change, newVal) }, { deep: true }) // 监听数据变化 watch(() [...state.tableData], (newVal) { emit(data-change, newVal.filter(item !state.hiddenIds.includes(item.id) )) }, { deep: true })4. 完整组件实现4.1 配置弹窗组件template el-dialog v-modelvisible title表格配置中心 div classconfig-container div classcolumn-panel h4可用列 (拖拽排序)/h4 ul refcolListRef li v-forcol in state.activeColumns :keycol.prop el-icon classdrag-handleMenu //el-icon el-checkbox v-modelcol.visible / span{{ col.label }}/span /li /ul /div div classpreview-panel PreviewTable :columnsstate.activeColumns.filter(c c.visible) :datafilteredData / /div /div template #footer el-button clickhandleCancel取消/el-button el-button typeprimary clickhandleConfirm保存配置/el-button /template /el-dialog /template script setup langts // 组件逻辑... /script4.2 行隐藏功能实现在行数据中添加控制字段const toggleRowVisibility (row: any) { const index state.hiddenIds.indexOf(row.id) if (index -1) { state.hiddenIds.splice(index, 1) } else { state.hiddenIds.push(row.id) } }对应的模板部分el-table-column label操作 template #default{ row } el-button sizesmall clicktoggleRowVisibility(row) {{ state.hiddenIds.includes(row.id) ? 显示 : 隐藏 }} /el-button /template /el-table-column5. 高级功能扩展5.1 配置持久化存储使用localStorage保存用户配置const CONFIG_KEY table_config // 保存配置 const saveConfig () { const config { columns: state.activeColumns, hiddenIds: state.hiddenIds } localStorage.setItem(CONFIG_KEY, JSON.stringify(config)) } // 读取配置 const loadConfig () { const config localStorage.getItem(CONFIG_KEY) if (config) { const { columns, hiddenIds } JSON.parse(config) state.activeColumns columns state.hiddenIds hiddenIds } }5.2 多表格配置管理当系统需要管理多个表格时可以扩展状态结构interface TableConfig { tableKey: string columns: TableColumn[] hiddenIds: string[] } const multiTableState reactive{ configs: TableConfig[] currentKey: string }({ configs: [], currentKey: })5.3 性能优化技巧对于大数据量表格可以采用虚拟滚动el-table :datafilteredData stylewidth: 100% height500px v-el-table-infinite-scrollloadMore !-- 列定义 -- /el-table6. 常见问题解决方案拖拽卡顿问题原因通常是由于频繁的响应式更新导致解决方案使用shallowRef替代ref减少深层响应式开销列顺序错乱问题原因Sortable.js操作的是DOM需要手动同步数据解决方案在onEnd回调中强制更新视图onEnd({ oldIndex, newIndex }) { // ...数据操作 nextTick(() { state.activeColumns [...state.activeColumns] }) }TypeScript类型报错 为Sortable.js事件添加类型定义interface SortableEvent { oldIndex: number newIndex: number item: HTMLElement from: HTMLElement to: HTMLElement }在实际项目中我发现将配置中心独立部署为微前端应用特别有用。不同系统可以共享同一套配置逻辑用户在任何系统中调整的表格偏好都能全局生效。这种设计在SAAS平台中尤其受欢迎用户反馈使用体验明显提升。

相关文章:

Vue3+Element Plus+Sortable.js:构建可定制化表格拖拽配置中心

1. 为什么需要表格拖拽配置中心 后台管理系统中最常见的需求之一就是表格展示数据。但不同用户对表格的展示需求往往不同:产品经理可能更关注日期和状态字段,运营人员则更看重用户行为和转化数据。传统解决方案是开发多个固定表格页面,但这会…...

手把手教你用ZEMAX复现Thorlabs锥透镜生成贝塞尔光束(附Edmund透镜库文件)

手把手教你用ZEMAX复现Thorlabs锥透镜生成贝塞尔光束(附Edmund透镜库文件) 在光学工程领域,贝塞尔光束因其无衍射特性和自修复能力,在激光加工、光学捕获和生物成像等应用中展现出独特优势。本文将带您从零开始,在ZEM…...

新能源车BMS低压管理避坑指南:如何解决上下电时序中的典型问题

新能源车BMS低压管理避坑指南:如何解决上下电时序中的典型问题 在新能源汽车的电池管理系统(BMS)开发中,低压上下电时序控制是确保系统稳定运行的关键环节。许多开发团队在实际项目中都会遇到信号冲突、时序错乱、异常处理机制不完…...

经典35kW V型磁钢永磁同步电机设计:基于Maxwell的成熟方案解析

基于Maxwell设计的 经典35kW,外径290 轴向长度88 3000RPM,111.5Nm, 6极36槽永磁同步电机(PMSM)设计案例(V型磁钢),该案例已制作样机,方案成熟,运行稳定,可直接用于生产&#xff0c…...

BP算法在SAR成像中的高效实现与优化策略

1. BP算法在SAR成像中的核心原理 BP(Back Projection)算法是合成孔径雷达(SAR)成像中最直观的时域处理方法。我第一次接触这个算法时,就被它那种"暴力美学"式的计算逻辑震撼到了——它不需要任何傅里叶变换的…...

投资分析太复杂?用TradingAgents-CN实现零代码智能分析的3个方案

投资分析太复杂?用TradingAgents-CN实现零代码智能分析的3个方案 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-CN作…...

多语言交易所/外汇系统源码/合约/期权/杠杆合约 秒合约/理财/申购

支持控盈亏等等功能支持合约、期权两大交易品类(当前选中「期权」),以 XRP/USDT 为交易对示例,提供双向交易:买涨(做多):预判价格上涨时开仓盈利买跌(做空)&a…...

告别恼人红叉!保姆级教程:用acme.sh给宝塔面板IP地址换上Let‘s Encrypt免费证书

从红叉到绿锁:零成本为宝塔面板IP地址部署可信SSL证书全指南 每次打开宝塔面板,那个刺眼的红色安全警告是否让你如鲠在喉?作为服务器管理员,我们比谁都清楚自签名证书的实际安全性,但浏览器固执的警告提示却让新手用户…...

如何永久保存微信聊天记录?WeChatMsg终极指南让你重获数据掌控权

如何永久保存微信聊天记录?WeChatMsg终极指南让你重获数据掌控权 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...

OpCore-Simplify:如何将黑苹果EFI配置从3小时缩短到15分钟?

OpCore-Simplify:如何将黑苹果EFI配置从3小时缩短到15分钟? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域…...

视频修复终极指南:如何用UNTRUNC拯救你的损坏视频文件

视频修复终极指南:如何用UNTRUNC拯救你的损坏视频文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 还记得那…...

深入解析RS485接口:从硬件设计到工业应用

1. RS485接口基础解析 第一次接触RS485时,我也被它复杂的电气特性搞得一头雾水。直到在工厂里亲眼看到它如何稳定地穿过嘈杂的电机区域传输数据,才真正理解这个老牌工业接口的魅力。RS485本质上是一种差分信号传输标准,采用双绞线进行平衡传…...

FRCRN处理长音频文件实战:切片、批处理与结果合并

FRCRN处理长音频文件实战:切片、批处理与结果合并 你是不是遇到过这样的问题?手头有一段长达数小时的会议录音、访谈素材或者播客音频,背景噪音让人头疼,想用FRCRN这样的降噪模型处理一下,结果发现模型一次只能处理几…...

CLIP-GmP-ViT-L-14算力适配:自动检测CUDA版本并加载对应优化内核

CLIP-GmP-ViT-L-14算力适配:自动检测CUDA版本并加载对应优化内核 1. 引言:当高性能模型遇见复杂环境 如果你部署过AI模型,大概率遇到过这样的场景:好不容易把模型跑起来了,却发现速度慢得让人抓狂,或者干…...

药物研发新思路:共价对接工具AutoDock4实战指南(附避坑技巧)

药物研发新思路:共价对接工具AutoDock4实战指南(附避坑技巧) 在当今药物研发领域,共价抑制剂因其独特的作用机制和显著的治疗优势正受到前所未有的关注。与传统非共价药物相比,这类分子能与靶蛋白形成稳定的共价键&…...

暗黑破坏神2单机增强神器:PlugY插件全方位使用指南

暗黑破坏神2单机增强神器:PlugY插件全方位使用指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 对于暗黑破坏神2单机玩家而言,有限的储物空…...

洗衣留香珠市场:其中亚太地区以12.5%的增速领跑全球市场

据权威市场研究机构预测,2024年全球洗衣留香珠市场规模预计突破35亿美元,年复合增长率达8.2%,其中亚太地区以12.5%的增速领跑全球市场。这一功能性香氛产品正从附加型消费向日常洗护必需品转型,其技术迭代与市场渗透呈现出高端化、…...

Kettle数据迁移实战:从CSV到MySQL的高效导入指南

1. 为什么选择Kettle进行CSV到MySQL的数据迁移 第一次接触数据迁移任务时,我试过用Python脚本逐行读取CSV写入MySQL,结果导入10万条数据花了近20分钟。后来发现Kettle这个神器,同样的数据量只需要2分钟就能搞定,效率提升简直惊人。…...

从SolidWorks到ROS:六自由度机械臂URDF模型转换实战指南

1. 从SolidWorks到ROS的桥梁:URDF模型转换概述 当你费尽心思在SolidWorks中完成了六自由度机械臂的三维建模,看着那些精密的齿轮和连杆在软件中流畅转动时,脑海中可能已经浮现出它在ROS环境中大展身手的场景。但问题来了:如何让这…...

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

逆向工程实战:Kasada最新版x-kpsdk-cd环境检测的深度调试策略 在当今Web安全防护体系中,Kasada作为新一代反自动化攻击解决方案,其x-kpsdk-cd机制通过动态加密和运行时环境检测构建了强大的防御层。面对从280位扩展到294位的加密数组和Proxy保…...

无损视频剪辑效率全攻略:5分钟掌握革新性剪辑技术

无损视频剪辑效率全攻略:5分钟掌握革新性剪辑技术 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 你是否曾因视频剪辑软件的漫长渲染过程而错失发布良机&a…...

香橙派Armbian系统下,用apt一键安装OpenCV的完整流程(含GPG报错解决)

香橙派Armbian系统下OpenCV-Python极简安装指南:绕过源码编译的终极方案 在单板计算机领域,香橙派凭借其出色的性价比逐渐崭露头角。当开发者尝试在这类ARM架构设备上构建计算机视觉应用时,OpenCV往往是不可或缺的核心工具。然而,…...

IIS请求筛选规则实战:手把手教你用‘拒绝字符串’精准拦截SQL注入和恶意爬虫

IIS请求筛选规则实战:构建精准防御体系的完整指南 当你的网站遭遇SQL注入攻击时,服务器日志里那些可疑的 OR 11--字符串是否让你夜不能寐?面对每天数十万次的恶意爬虫扫描,是否觉得传统的防火墙规则力不从心?IIS的请求…...

卡尔曼滤波调参实战:如何用MATLAB让MPU6050的加速度数据更‘听话’?

卡尔曼滤波调参实战:如何用MATLAB让MPU6050的加速度数据更‘听话’? 当你在MATLAB中第一次看到MPU6050的原始加速度数据时,那些疯狂跳动的曲线可能会让你怀疑人生。别担心,这不是传感器坏了,而是现实世界本就充满噪声…...

【flash-attn安装成功却import失败?一个ABI参数引发的‘血案’】

1. 为什么flash-attn安装成功却import失败? 最近在部署Llama2模型时,遇到了一个让人抓狂的问题:明明用pip安装了flash-attn,执行import时却报错提示找不到这个包。更诡异的是,pip list明明显示安装成功了,…...

别再死磕英文手册了!手把手带你用Lisflood-FP跑通第一个洪水模拟案例(附T001_buscot实战)

从零到一:Lisflood-FP洪水模拟实战指南(T001_buscot案例详解) 刚接触水文模型的研究者常被英文手册劝退——密密麻麻的公式、晦涩的术语、复杂的参数配置让人望而生畏。其实,掌握Lisflood-FP的关键不在于死磕理论,而在…...

从LFA到TI-LFA:一张图看懂华为IGP FRR技术演进与选型指南

从LFA到TI-LFA:华为IGP FRR技术全景解析与实战选型 当视频会议因网络抖动出现卡顿时,当金融交易因路由收敛延迟导致订单丢失时,网络工程师们开始意识到:传统的IGP收敛机制已无法满足现代业务对可靠性的苛刻要求。这背后是毫秒级故…...

基于pyqt的规则匹配的恶意代码检测系统

当前的恶意代码检测研究中,尽管传统特征匹配(signature-based detection)仍然广泛应用,但面对快速更新且具有混淆、加壳、动态加载、自变异(polymorphism/metamorphism)等能力的新型恶意代码&am…...

华为HMS Scan Kit Customized View Mode:打造品牌专属扫码界面的实战指南

1. 为什么选择Customized View Mode? 扫码功能已经成为现代App的标配,但很多开发者面临一个两难选择:要么用系统默认的扫码界面显得千篇一律,要么完全自己开发一套又耗时耗力。华为HMS Scan Kit的Customized View Mode正好解决了这…...

Scratch飞翔小鸟游戏制作教程:从零开始打造你的第一个像素风小游戏

Scratch飞翔小鸟游戏制作教程:从零开始打造你的第一个像素风小游戏 当孩子们第一次接触编程时,往往会被复杂的代码和抽象的概念吓退。而Scratch就像一扇通往创意世界的大门,用积木式的编程方式让游戏开发变得触手可及。今天,我们将…...