【前端开发】基于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 }
复制代码

 

效果

 

 

posted @   JeckHui  阅读(4715)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示