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

Vue+sortable+el-table表格排序使用指南

前言

这两天遇到一个需求:在点击【设置优先级】的按钮后弹出关于玩法类型的table,点击【排序】按钮可以后可以进行排序。由于组内使用的组件库是 element-ui,那我首先就想到了使用 el-table组件,但奈何其版本原因不能相应的拖拽排序的API。了解到有sortable.js。接下来我就以Vue+el-table+sortable 为例看看我是怎么实现这个需求的。

在这里插入图片描述

实现思路

从官网的 demo 以及其他文章的操作中基本上实现过程如下:

const tableData = []const _this = thissetTimeout(()=>{Sortable.create(el, {onEnd:function (evt){// evt 可以获取到拖拽 DOM 在拖拽之前和拖拽之后的 index// 利用这个参数就可以对table中的列表排序const list = tableData; // 备份 table 中的数据const currRow = list.splice(evt.oldIndex, 1)[0]; // 获取当前被拖拽的数据list.splice(evt.newIndex, 0, currRow); // 将拖拽的数据从数组中拿出来并插入到新的位置tableData = [] // 置空 table 中的数据nextTick(()=>{tableData = list // 将最新的数据给table})}})
})

但我在实现过程有遇到几个问题。首先,直接如上所示拖拽功能是没问题的,但是在排序的时候如果不加 nextTicke 那么就会出现你明明只将最后一条数据拖拽到第一行,却出现最后两行出现在了最前面…另外,这里使用 setTimeout是为了确保能拿到DOM,毕竟弹窗时不一定能拿到 table DOM。

源码

由于我是两个table,所以使用了 el-tabs,tab切换时会更新 activeName

  function initSort() {const _this = thissetTimeout(() => {const parentEle = _this.$refs.playTypeTabsRefconst tab1 = parentEle .children[0].querySelectorAll('.el-table__body-wrapper > table > tbody')[0]const tab2 = parentEle .children[1].querySelectorAll('.el-table__body-wrapper > table > tbody')[0]const targetTab = this.activeName === 'playType' ? tab1 : tab2const createSortable = () => {Sortable.create(targetTab, {animation: 150,// ghostClass: 'blue-background-class',// handle: 'handle',draggable: '.el-table__row',onEnd: function(evt) {const list: (IPlayTypeItem | ISubPlayTypeItem)[] = _this.activeName === 'playType' ? _this.playTypeList : _this.subPlayTypeListconst currRow: IPlayTypeItem | ISubPlayTypeItem = list.splice(evt.oldIndex, 1)[0]list.splice(evt.newIndex, 0, currRow)_this.activeName === 'playType' ? _this.playTypeList = [] : _this.subPlayTypeList = []_this.$nextTick(() => {if (_this.activeName === 'playType') {_this.playTypeList = list as IPlayTypeItem[]} else {_this.subPlayTypeList = list as ISubPlayTypeItem[]}})}})}createSortable()}, 0)}
http://www.lryc.cn/news/468028.html

相关文章:

  • 表数据删一半,为什么表文件大小不变?
  • MoCoOp: Mixture of Prompt Learning for Vision Language Models
  • YOLOv8 onnx 部署
  • 在文件里引用目录文件下的静态资源图片不显示
  • vue使用 jsplumb 生成流程图
  • 攻坚金融关键业务系统,OceanBase亮相2024金融科技大会
  • 《纳瓦尔宝典:财富和幸福指南》读书随笔
  • C++ | STL | 侯捷 | 学习笔记
  • C函数基础
  • html和css实现页面
  • Github_以太网开源项目verilog-ethernet代码阅读与移植(八)——移植工程分享
  • 【大模型实战篇】大模型分词算法BPE(Byte-Pair Encoding tokenization)及代码示例
  • 低功耗4G模组LCD应用示例超全教程!不会的小伙伴看这篇就够了!
  • Java while语句练习 C语言的函数递归
  • illustrator免费插件 截图识别文字插件 textOCR
  • 提升数据管理效率:ETLCloud与达梦数据库的完美集成
  • 头歌——人工智能(搜索策略)
  • gorm.io/sharding改造:赋能单表,灵活支持多分表策略(下)
  • 域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用
  • C++进阶-->继承(inheritance)
  • 可视化项目 gis 资源复用思路(cesium)
  • SQL实战测试
  • Java 基础教学:基础语法-变量与常量
  • vue3使用element-plus手动更改url后is-active和菜单的focus颜色不同步问题
  • 每天五分钟深度学习框架pytorch:从底层实现一元线性回归模型
  • 编辑器加载与AB包加载组合
  • 【c++】vector中的back()函数
  • [分享] SQL在线编辑工具(好用)
  • element-ui隐藏表单必填星号
  • 自动驾驶系列—激光雷达点云数据在自动驾驶场景中的深度应用