在vue3 setup下基于Ant Design Vue 实现一个可拖拽行的表格

拖拽表格

1、使用原生的drag事件
2、使用ant design vue Table的customRow属性

<script setup>
import { ref } from "vue";

const dataSource = ref([
  {
    key: "1",
    name: "John Brown",
    age: 32,
    address: "New York No. 1 Lake Park",
  },
  { key: "2", name: "Jim Green", age: 42, address: "London No. 1 Lake Park" },
  { key: "3", name: "Joe Black", age: 32, address: "Sidney No. 1 Lake Park" },
]);

const columns = ref([
  {
    title: "Name",
    dataIndex: "name",
    key: "name",
  },
  {
    title: "Age",
    dataIndex: "age",
    key: "age",
  },
  {
    title: "Address",
    dataIndex: "address",
    key: "address",
  },
]);

const onDragEnd = (result) => {
  if (!result.destination) return;
  const items = Array.from(dataSource.value);
  const [reorderedItem] = items.splice(result.source.index, 1);
  items.splice(result.destination.index, 0, reorderedItem);
  dataSource.value = items;
};

const customRow = (_record, index) => {
  return {
    draggable: true,
    ondragstart: (event) => {
      // 设置拖放行的索引
      event.dataTransfer.setData("text/plain", index);
    },
    ondragover: (event) => {
      event.preventDefault();
    },
    ondrop: (event) => {
      // 获取拖放行的索引
      event.preventDefault();
      const fromIndex = event.dataTransfer.getData("text/plain");
      const toIndex = index;
      onDragEnd({
        source: { index: +fromIndex },
        destination: { index: +toIndex },
      });
    },
  };
};
</script>

<template>
  <a-table
    :dataSource="dataSource"
    :columns="columns"
    rowKey="key"
    :customRow="customRow"
  >
    <template #headerCell="scope">
      <slot name="headerCell" :scope="scope"></slot>
    </template>
    <template #bodyCell="{ record, column }">
      <template v-if="column.dataIndex === 'name'">{{ record.name }}</template>
      <template v-if="column.dataIndex === 'age'">{{ record.age }}</template>
      <template v-if="column.dataIndex === 'address'">{{
        record.address
      }}</template>
    </template>
  </a-table>
</template>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值