【前端开发】基于vue的树形结构table拖拽排序教程
安装依赖drag-tree-table(更多文档见github)
yarn add drag-tree-table
html
<dragTreeTable ref="table" :data="treeData" @drag="onTreeDataChange" onlySameLevelCanDrag resize fixed :isdraggable="true" > <template #selection="{row}"> {{ row.menuName }} </template> <template #icon="{row}"> <svg-icon :icon-class="row.icon" /> </template> <template #visible="{row}"> <div @click.stop> <el-switch @change=" val => { visiableChange(val, row) } " v-model="row.visible" active-value="0" inactive-value="1" /> </div> </template> <template #edit="{row}"> <el-button v-hasPermi="['system:menu:edit']" type="text" icon="el-icon-edit" @click.stop.prevent="handleUpdate(row)" >编辑</el-button > <el-button v-hasPermi="['system:menu:add']" type="text" icon="el-icon-plus" @click.stop.prevent="handleAdd(row)" >新增</el-button > <el-button v-hasPermi="['system:menu:remove']" class="btn-delete" type="text" icon="el-icon-delete" @click.stop.prevent="handleDelete(row)" >删除</el-button > </template> </dragTreeTable>
js
import dragTreeTable from 'drag-tree-table' @Component({ name: 'MenuManage', components: { dragTreeTable } }) private tableIdArr: Array<string> = [] private treeData: any = { lists: [], columns: [ { type: 'selection', title: '菜单名称', field: 'menuName', width: 130, align: 'left' }, { type: 'icon', title: '图标', field: 'icon', width: 100 }, // { // title: '排序', // field: 'orderNum', // width: 60 // }, { title: '权限标识', field: 'perms', width: 130 }, { title: '组件路径', field: 'component', width: 180 }, { type: 'visible', title: '可见', field: 'visible', width: 80 }, { title: '创建时间', field: 'createTime', width: 180 }, { type: 'edit', title: '操作', field: '', width: 200, align: 'center' } ] }
拖拽方法
// 树形table拖拽排序 onTreeDataChange(list: Array<object>, curObj: any) { this.treeData.lists = list // 拖拽后的数据 this.tableIdArr = [] // const idArr = this.filterIdArrFun(JSON.parse(JSON.stringify(list)), curObj.parent_id) const putData = { parentId: curObj.parent_id, // 父目录id ids: this.tableIdArr // 同级id }
// 得到父id和同级id数组即可请求接口
} /** 递归获取父级id相同对象的id数组 **/ filterIdArrFun(data: any, parentId: string) { const firstFun = data.map((q: any) => { if (q.lists && q.lists.length > 0) { if (q.parentId == parentId) { this.tableIdArr.push(q.id) } q.lists = this.filterIdArrFun(JSON.parse(JSON.stringify(q.lists)), parentId) } else { if (q.parent_id === parentId) { this.tableIdArr.push(q.id) } } return q }) return this.tableIdArr }
效果

本文来自博客园,作者:JeckHui;
个人主页:前端实用站点推荐; 热榜资讯早读:热榜资讯-导航;
转载请注明原文链接:https://www.cnblogs.com/xiaohuizhang/p/14931211.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)