vue3.0 + antdesgin vue+ts 实现table表格的拖拽排序

vue3.0 + antdesgin vue+ts 实现table表格的拖拽排序

效果图:
在这里插入图片描述

1、npm install sortablejs --save
2、import Sortable from ‘sortablejs’;
在这里插入图片描述

   <a-table
        class="sort-table-content"
        :columns="columns"
        bordered
        rowKey="id"
        :loading="loading"
        :data-source="tableData"
        :scroll="{ y: 'calc(100vh - 250px)' }"
        :pagination="false"
        size="small"
        v-if="tableData.length"
        :defaultExpandAllRows="true"
      >
        <template #action="{ record }">
          <a-button type="link" @click="handleOk('addSubMenu', '', '', record)"
            >新增子菜单</a-button
          >
          <a-button type="link" style="color: red" @click="delect('Menu', record.id)"
            >删除</a-button
          >
        </template>
        <template #expand>
          <a-button type="link" @click="handleDragClick"
            >{{ !enableDrag ? '拖动排序' : '取消拖动' }}
          </a-button>
        </template>
        <template #dragHandle>
          <MenuOutlined :style="iconStyle" />
        </template>
        <template #isDisplay="{ record }">
          {{ record.isDisplay ? '显示' : '隐藏' }}
        </template>
      </a-table>
      <!-- 空表格 表格数据length为0时展示空表格 -->
      <a-table
        class="sort-table-content"
        :columns="columns"
        bordered
        rowKey="id"
        :loading="loading"
        :data-source="tableData"
        :scroll="{ y: 'calc(100vh - 250px)' }"
        :pagination="false"
        size="small"
        v-if="tableData.length === 0 || null"
        :defaultExpandAllRows="true"
      >
        <template #expand>
          <a-button type="link" @click="handleDragClick"
            >{{ !enableDrag ? '拖动排序' : '取消拖动' }}
          </a-button>
        </template>
      </a-table>

2、在获取到表格数据后调用拖拽方法
在这里插入图片描述

3、在这里插入图片描述

 //拖拽
  //拖拽
    function sortMenuTable() {
      let el: any = document.querySelectorAll(
        '.sort-table-content>.ant-spin-nested-loading>.ant-spin-container>.ant-table>.ant-table-content>.ant-table-scroll>.ant-table-body>table > tbody'
      )[0];
      var sort = Sortable.create(el as any, {
        ghostClass: 'sortable-ghost',
        setData: function (dataTransfer: any) {
          dataTransfer.setData('Text', '');
        },
        onMove: function (evt: any, originalEvent: any) {
          if (!enableDrag.value) return false;
          else return true;
        },
        onEnd: (evt: any) => {
          if (evt.oldIndex === evt.newIndex) return;
          let state = evt.oldIndex > evt.newIndex ? 'before' : 'after';
          let newMenu = orderList.value[evt.newIndex].id;
          let oldMenu = orderList.value[evt.oldIndex].id;
          if (orderList.value[evt.newIndex].parentId !== orderList.value[evt.oldIndex].parentId) {
            message.warning('只支持同父级排序');
            getMenuListFn(systemId.value);
          } else {
            sortChange(newMenu, oldMenu, state);
          }
        },
      });
    }
    //排序调接口
    async function sortChange(newMenu: string, oldMenu: string, state: string) {
      let param = {
        clickId: oldMenu, //操作id
        letId: newMenu, //基准id
        status: state, //操作类型
      };
      let res = await subSysApi.sortSubsystem(param);
      if (!res) {
        return;
      }
      if (res?.success) {
        message.success(res.msg);
        getMenuListFn(systemId.value);
      } else {
        message.error(res.msg);
        getMenuListFn(systemId.value);
      }
    }
    //处理数据
    function getOrderList(list: Array<object>) {
      orderList.value = []; //需要清空一下数据,否则是一直push
      for (let i of list) {
        getOlderChild(i);
      }
    }
    function getOlderChild(item: any) {
      orderList.value.push(item);
      if (item.children) {
        for (let i of item.children) {
          getOlderChild(i);
        }
      }
    }

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值