antd-vue-table 实现表格的拖拽换顺序,100%成功

这篇博客展示了如何利用Ant Design Vue的表格组件实现数据行的拖拽排序功能。通过监听`onDragstart`、`onDragover`、`onDrop`等事件,配合数据操作,实现了表格行的交互式交换位置。代码示例中详细解释了各个关键步骤,为读者提供了直接可用的代码片段。
摘要由CSDN通过智能技术生成

话不多说啊,兄弟们,看到很多人在找这个,我马上给你们安排了
直接上代码安排起来好吧
直接拿捏
当然 用AntdVue团队里面的高级组件就能实现各种高级效果 我的这个就是简单的例子
我把高级组件地址给你们贴出来,下载安装都可以看这个文档: Surely Vue

我的就是简单的 antd-vue 表格的操作 偷懒的直接用就行

<template>
  <div class="approvalStyle">
    <a-table
      style="margin-top: 20px; background: #fff"
      :columns="columns"
      :dataSource="dataSource"
      :customRow="customRow"
    >
    </a-table>
  </div>
</template>

<script>
import { Table } from 'ant-design-vue'; // 引入antd的表格,样式引入自己配置
import { reactive } from '@vue/reactivity';

export default {
  name: 'Atable',
  components: {
    [Table.name]: Table
  },
  data() {
    return {
      columns: [
        {
          dataIndex: 'name',
          title: 'name'
        },
        {
          dataIndex: 'address',
          title: 'address'
        },
        {
          dataIndex: 'age',
          title: 'age'
        }
      ]
    };
  },
  setup() {
    let change1 = null; // 源目标数据序号
    let change2 = null; // 目标数据序号
    let dataSource = reactive([
      {
        name: '张三',
        age: 14,
        address: '北京',
        key: 3
      },
      {
        name: '李四',
        age: 15,
        address: '南京',
        key: 2
      },
      {
        name: '王五',
        age: 16,
        address: '东京',
        key: 1
      }
    ]);
    function customRow(record, index) {
       console.log(record, index);// 这里输出是表格全部的数据
      return {
        props: {
          // draggable: 'true'
        },
        style: {
          cursor: 'pointer'
        },
        // 鼠标移入
        onMouseenter: (event) => {
          // 兼容IE
          var ev = event || window.event;
          ev.target.draggable = true; // 让你要拖动的行可以拖动,默认不可以
        },
        // 开始拖拽
        onDragstart: (event) => {
          // 兼容IE
          var ev = event || window.event;
          // 阻止冒泡
          ev.stopPropagation();
          // 得到源目标数据序号
          change1 = index;
          console.log(record, index, 'source');
        },
        // 拖动元素经过的元素
        onDragover: (event) => {
          // 兼容 IE
          var ev = event || window.event;
          // 阻止默认行为
          ev.preventDefault();
        },
        // 鼠标松开
        onDrop: (event) => {
          // 兼容IE
          var ev = event || window.event;
          // 阻止冒泡
          ev.stopPropagation();
          // 得到目标数据序号
          change2 = index;
          // 这里就是让数据位置互换,让视图更新 你们可以看record,index的输出,看是什么
          [dataSource[change1], dataSource[change2]] = [
            dataSource[change2],
            dataSource[change1]
          ];
          console.log(record, index, 'target');
        }
      };
    }
    return {
      dataSource,
      customRow
    };
  }
};
</script>

<style lang="less" scoped>
.approvalStyle {
  .listStyle {
    font-size: 16px;
    padding: 20px;
    background: #fff;
    width: 300px;
    border: 1px solid #efefef;
  }
}
</style>

下面是一个完整的示例代码,基于Vue2,antd和sortablejs实现了两个表格之间的数据拖拽功能。 ```html <template> <div> <h2>表格1</h2> <a-table :columns="columns" :dataSource="list1" rowKey="id"> <template #name="{text, record}"> <span v-text="text" v-sortable="'table1'"></span> </template> </a-table> <h2>表格2</h2> <a-table :columns="columns" :dataSource="list2" rowKey="id"> <template #name="{text, record}"> <span v-text="text" v-sortable="'table2'"></span> </template> </a-table> </div> </template> <script> import Sortable from 'sortablejs' import { Table } from 'ant-design-vue' export default { components: { 'a-table': Table, }, data() { return { columns: [ { title: '姓名', dataIndex: 'name' }, { title: '年龄', dataIndex: 'age' }, ], list1: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, ], list2: [], } }, mounted() { Sortable.create(this.$el.querySelector('.ant-table-tbody'), { group: { name: 'table1', put: ['table2'], }, animation: 150, fallbackOnBody: true, swapThreshold: 0.65, onEnd: this.onEnd, }) Sortable.create(this.$el.querySelectorAll('.ant-table-tbody')[1], { group: { name: 'table2', put: ['table1'], }, animation: 150, fallbackOnBody: true, swapThreshold: 0.65, onEnd: this.onEnd, }) }, methods: { onEnd(evt) { const { oldIndex, newIndex, item } = evt if (oldIndex !== newIndex) { const table = evt.to.dataset.table if (table === 'table1') { // 从表格1拖拽表格2 this.list2.splice(newIndex, 0, this.list1.splice(oldIndex, 1)[0]) } else { // 从表格2拖拽表格1 this.list1.splice(newIndex, 0, this.list2.splice(oldIndex, 1)[0]) } } }, }, } </script> ``` 在此示例中,我们使用了Ant Design Vue中的`<a-table>`组件来渲染表格,并在模板中使用了Vue的`v-sortable`指令来绑定Sortable实例。在mounted钩子函数中,我们为每个表格的tbody元素创建了Sortable实例,并将它们分组为“table1”和“table2”。然后,我们在onEnd方法中处理拖拽完成事件,并根据拖拽的方向和目标表格移动数据。 需要注意的是,在模板中,我们使用了`<span>`元素包装了表格中的文本数据,来实现拖拽时只能拖拽文本数据而不是整个行。同时,在Sortable实例的options中,我们设置了`fallbackOnBody`为true,这样拖拽元素在拖拽结束时会回到原来的位置,而不是消失。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值