a-table树形表格拖拽排序 切换层级等问题

html代码

<a-table
      :columns="datacolumns"
      defaultExpandAllRows
      :data-source="dataAtr"
      :customRow="customRow"
    />

js代码如下

import { defineComponent, ref } from 'vue';
  const datacolumns = [
    {
      title: 'Name',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: 'Age',
      dataIndex: 'age',
      key: 'age',
      width: '12%',
    },
    {
      title: 'Address',
      dataIndex: 'address',
      width: '30%',
      key: 'address',
    },
  ];
  const dataAtr = ref([
    {
      key: 1,
      name: 'John Brown sr.1',
      age: 60,
      address: 'New York No. 1 Lake Park',
      children: [
        {
          pkey: 1,
          key: 2,
          name: 'John Brown2',
          age: 42,
          address: 'New York No. 2 Lake Park',
        },
        {
          pkey: 1,
          key: 3,
          name: 'John Brown jr.3',
          age: 30,
          address: 'New York No. 3 Lake Park',
        },
        {
          pkey: 1,
          key: 5,
          name: 'Jim Green sr.5',
          age: 72,
          address: 'London No. 1 Lake Park',
        },
      ],
    },
    {
      key: 9,
      name: 'Joe Black9',
      age: 32,
      address: 'Sidney No. 1 Lake Park',
      children: [
        {
          pkey: 9,
          key: 10,
          name: 'John Brown 10',
          age: 42,
          address: 'New York No. 2 Lake Park',
        },
        {
          pkey: 9,
          key: 11,
          name: 'John Brown 11',
          age: 42,
          address: 'New York No. 2 Lake Park',
        },
      ],
    },
    {
      key: 12,
      name: 'Joe Black12',
      age: 32,
      address: 'Sidney No. 1 Lake Park',
    },
  ]);
  //排序拖拽方法
  const startRecord = ref({}); //选移动下标
  const endRecord = ref({}); //移动下标
  const changeData = (list, key, item) => {
    list = list.map((ele) => {
      if (ele.key == key) {
        ele = {
          ...ele,
          name: item.name,  //需要交换的数据 除key 外可以自行替换
        };
        console.log(ele);
        return ele;
      }
      if (ele.children) {
        ele.children = changeData(ele.children, key, item);
      }
      return ele;
    });
    console.log(list);
    return list;
  };
  const customRow = (record: any, index: any) => {
    console.log('=====触发拖拽====', record);
    return {
      style: {
        cursor: 'pointer',
      },
      // 鼠标移入
      onMouseenter: (event) => {
        // 兼容IE
        var ev = event || window.event;
        ev.target.draggable = true; // 让你要拖动的行可以拖动,默认不可以
      },
      // 开始拖拽
      onDragstart: (event) => {
        console.log('=====拖拽的点击事件开始====', record.key, event, index);
        // 兼容IE
        var ev = event || window.event;
        // 阻止冒泡
        ev.stopPropagation();
        // 得到源目标数据序号
        startRecord.value = record;
      },
      // 拖动元素经过的元素
      onDragover: (event) => {
        // 兼容 IE
        var ev = event || window.event;
        // 阻止默认行为
        ev.preventDefault();
      },
      // 鼠标松开
      onDrop: (event) => {
        // 兼容IE
        console.log('=====拖拽的点击事件结束====', record.key, event, index);
        var ev = event || window.event;
        // 非同级不能拖拽
        if (startRecord.value.pkey != record.pkey) {
          ev.target.draggable = false;
          return false;
        } else {
          ev.target.draggable = true;
        }
        // 阻止冒泡
        ev.stopPropagation();
        // 得到目标数据序号
        endRecord.value = record;
        let startKey = startRecord.value.key;
        let endKey = endRecord.value.key;
        // 这里就是让数据位置互换
        dataAtr.value = changeData(dataAtr.value, startKey, endRecord.value);
        dataAtr.value = changeData(dataAtr.value, endKey, startRecord.value);
        console.log(dataAtr.value);
      },
    };
  };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗_都不做前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值