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

vue3 + elementplus + sortablejs实现树形表格拖拽排序

实现功能

1、树形表格每次只展开一行,新的一行展开,旧行就需要收起(手风琴效果)
2、一级行能够拖拽排序,所有子级行不能拖拽
3、树形表格需要实现懒加载

UI包和sortablejs包

element plus
sortable

代码

html代码

<template><el-tablev-loading="loading"ref="tableRef":data="tableData"style="width: 100%"row-key="id"borderlazy:load="load":tree-props="{ children: 'children', hasChildren: 'hasChildren' }" //指定那些行包含子节点@expand-change="handleExpand":expand-row-keys="expandRowKeys":row-class-name="rowClassName"><el-table-column prop="date" label="Date" /><el-table-column prop="name" label="Name" /><el-table-column prop="address" label="Address" /></el-table>
</template>

JS代码


<script setup lang="ts">
import { ref, onMounted, nextTick } from 'vue'
import Sortable from 'sortablejs'interface User {id: stringdate: stringname: stringaddress: stringhasChildren?: booleanchildren?: User[]isFirst?: boolean  //是否一级节点
}const tableData = ref<User[]>([])
//设置 Table 目前的展开行
const expandRowKeys = ref<string[]>([]) 
const loading = ref<boolean>(false)
const tableRef = ref()const load = (row: User, _treeNode: unknown, resolve: ((date: User[]) => void) | undefined) => {// 模拟接口返回的数据setTimeout(() => {const loadData = [{id: `${row.id}-1`,date: '2024-09-01',name: `${row.id}-name`,address: 'china beijing'},{id: `${row.id}-2`,date: '2024-09-02',name: `${row.id}-name`,address: 'china beijing'}]resolve?.(loadData)}, 1000)
}// 遍历一级数据手动添加 isFirst 字段,用于添加类名,用于排序,和设置expand-row-keys (展开行的key)
const data: User[] = [{id: '1',date: '2024-09-01',name: 'zhangsan',address: 'china beijing',isFirst: true},{id: '2',date: '2024-09-02',name: 'zhangsan',hasChildren: true,address: 'china beijing',isFirst: true},{id: '3',date: '2024-09-09',name: 'zhangsan',hasChildren: true,address: 'china beijing',isFirst: true},{id: '4',date: '2024-09-11',name: 'zhangsan',hasChildren: true,address: 'china beijing',isFirst: true}
]const rowClassName = ({ row }: { row: User }) => {// 给第一级行 设置类名 用于sortable的draggable字段,指定类可排序if (row?.isFirst) {return 'sortItem'}return ''
}const handleExpand = (row: User, expanded: boolean) => {// 一级行实现手风琴if (row?.isFirst) {expandRowKeys.value = expanded ? [row.id] : []}
}const rowDrop = () => {const tbody = document.querySelector('.el-table__body-wrapper tbody') as HTMLElementSortable.create(tbody, {draggable: '.sortItem', // 拥有sortItem类名的行才能排序onStart: function () {// 拖拽开始收起所有张开的行expandRowKeys.value = []},onEnd(evt: any) {// newDraggableIndex , oldDraggableIndex 是可拖拽元素的下标,更具这两个下表获取id,传递给后端排序,重新获取数据//const { newDraggableIndex, oldDraggableIndex } = evt// const fromId = tableData.value[evt.oldDraggableIndex].id// const toId = tableData.value[evt.newDraggableIndex].id// 清空数据,重新渲染node,处理数据节点复用,视图未更新的问题const {newIndex, oldIndex} = evtif (oldIndex === newIndex) returnnextTick(() => {// 下次渲染更新数据loading.value = trueconst currRow = tableData.value.splice(oldIndex, 1)[0]setTimeout(() => {tableData.value.splice(newIndex, 0, currRow) //排序后的数据loading.value = false}, 200)})}})
}onMounted(() => {// 首次加载获取数据loading.value = truesetTimeout(() => {tableData.value = dataloading.value = false}, 3000)// 拖拽处理document.body.ondrop = function (event) {event.preventDefault()event.stopPropagation()}// 拖拽功能与配置rowDrop()
})
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 携手SelectDB,观测云实现性能与成本的双重飞跃
  • Docker搭建 RabbitMQ 最新版
  • 论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)
  • jupyter安装与使用——Ubuntu服务器
  • 【MATLAB源码-第231期】基于matlab的polar码编码译码仿真,对比SC,SCL,BP,SCAN,SSC等译码算法误码率。
  • C++ 面试模拟02
  • 【AI创作组】Matlab中进行符号计算
  • 【目标检测】隐翅虫数据集386张VOC+YOLO
  • 【ArcGIS微课1000例】0122:经纬网、方里网、参考格网绘制案例教程
  • UE4_后期处理七—仿红外线成像效果
  • MIME 类型
  • Ubuntu环境切换到服务器某个用户后source等命令和Tab快捷补全都用不了了,提示没找到,但root用户可以
  • java并发编程笔记 之 线程和进程
  • Unity 的Event的Use()方法
  • 太速科技-383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • gulp 教程
  • HTTP 简介
  • JavaScript 一些 DOM 的知识点
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • k个最大的数及变种小结
  • Linux各目录及每个目录的详细介绍
  • python 装饰器(一)
  • ReactNative开发常用的三方模块
  • Terraform入门 - 3. 变更基础设施
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 代理模式
  • 汉诺塔算法
  • 记一次删除Git记录中的大文件的过程
  • 简单基于spring的redis配置(单机和集群模式)
  • 一道面试题引发的“血案”
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • const的用法,特别是用在函数前面与后面的区别
  • ​HTTP与HTTPS:网络通信的安全卫士
  • !!Dom4j 学习笔记
  • (09)Hive——CTE 公共表达式
  • (arch)linux 转换文件编码格式
  • (C++20) consteval立即函数
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)http协议
  • .gitignore文件—git忽略文件
  • .NET 表达式计算:Expression Evaluator
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 的字符串暂存池
  • .NET企业级应用架构设计系列之技术选型
  • .Net中ListT 泛型转成DataTable、DataSet
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @JsonFormat 和 @DateTimeFormat 的区别
  • @requestBody写与不写的情况
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @Service注解让spring找到你的Service bean
  • @SpringBootApplication 包含的三个注解及其含义