vue3+ts 不使用插件实现table列表的拖拽排序。

文章详细描述了如何在Vue项目中使用ElementUI的el-table组件实现表格数据的拖拽排序功能,包括模板代码和相关事件处理函数。
摘要由CSDN通过智能技术生成

一、效果展示:

二、完整代码

<template>
  <el-table :data="tableData" style="width: 100%" :row-class-name="activeClass" class="outputTable">
    <el-table-column prop="sort" label="Sort" width="180" />
    <el-table-column prop="date" label="Date" width="180" />
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="address" label="Address" />
  </el-table>
</template>

<script lang="ts" setup>
import { nextTick, ref } from 'vue';

const tableData = ref<any>([
  {
    sort:'1',
    date: "2016-05-03",
    name: "Tom1",
    address: "No. 189, Grove St, Los Angeles",
  },
  {
    sort:'2',
    date: "2016-05-02",
    name: "Tom2",
    address: "No. 189, Grove St, Los Angeles",
  },
  {
    sort:'3',
    date: "2016-05-04",
    name: "Tom3",
    address: "No. 189, Grove St, Los Angeles",
  },
  {
    sort:'4',
    date: "2016-05-01",
    name: "Tom4",
    address: "No. 189, Grove St, Los Angeles",
  },
])

const dragIndex = ref<any>();
const newDragIndex = ref<any>();
const activeClass = ({ row, rowIndex }) => {
  if (rowIndex === newDragIndex.value) {
    return "isDragBox active-drag";
  }
  return "isDragBox";
};

const dragStartItem = (idx) => {
  dragIndex.value = idx;
};
const dragOverItem = (index) => {
  newDragIndex.value = index;
};
const dragEndItem = () => {
  const data =  tableData.value[dragIndex.value];
  tableData.value.splice(dragIndex.value, 1);
  tableData.value.splice(newDragIndex.value, 0, data);
  tableData.value.forEach((item, index) => {
    return (item.sort = index);
  });
};

const handleSort = () => {
  nextTick(() => {
    const dragBox = document.querySelectorAll(".outputTable .isDragBox");
    dragBox.forEach((i: any, idx) => {
      i.setAttribute("draggable", "true");
      i.ondragstart = () => dragStartItem(idx);
      i.ondragover = () => dragOverItem(idx);
      i.ondragend = () => dragEndItem();
    });
  });
};
handleSort()

</script>
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在Vue3+TypeScript项目实现VxeTable拖拽排序功能,可以按照以下步骤进行: 1. 安装VxeTable和相关依赖: ``` npm install xe-utils @vue/composition-api vxe-table@next ``` 2. 在Vue3项目引入Composition API: ```js import { createApp } from 'vue' import { createRouter, createWebHistory } from 'vue-router' import { createHead } from '@vueuse/head' import { useRoute, useRouter } from 'vue-router' import { useMeta } from 'vue-meta' import { ref, reactive, toRefs, onMounted, onUnmounted } from 'vue' import { VXETable } from 'vxe-table' import App from './App.vue' import routerConfig from './router' const app = createApp(App) app.use(router) app.use(createHead()) app.use(VXETable) app.mount('#app') ``` 3. 创建一个Vue3组件,并在其引入VxeTable和相关依赖: ```html <template> <div> <vxe-table ref="xTable" :columns="columns" :data="data" @sort-change="handleSortChange" @header-dragend="handleHeaderDragend"></vxe-table> </div> </template> <script lang="ts"> import { ref, reactive } from 'vue' import { VXETable, ColumnInfo } from 'vxe-table' export default { setup () { const xTable = ref(null) const columns = ref([ { field: 'name', title: 'Name', sortable: true }, { field: 'age', title: 'Age', sortable: true }, { field: 'gender', title: 'Gender', sortable: true } ]) const data = ref([ { name: 'John', age: 21, gender: 'Male' }, { name: 'Mary', age: 28, gender: 'Female' }, { name: 'Bob', age: 35, gender: 'Male' } ]) const handleSortChange = (params: { column: ColumnInfo, prop: string, order: string }) => { console.log('Sort Change:', params) } const handleHeaderDragend = (params: { columns: ColumnInfo[] }) => { console.log('Header Dragend:', params) } onMounted(() => { VXETable.setup({ table: { mouseConfig: { selected: { mode: 'single' } } } }) }) onUnmounted(() => { VXETable.destroy() }) return { xTable, columns, data, handleSortChange, handleHeaderDragend } } } </script> ``` 4. 然后,在handleHeaderDragend方法,可以获取到排序后的列信息,然后根据这些信息修改data的数据以实现拖拽排序功能。 这样,就可以在Vue3+TypeScript项目实现VxeTable拖拽排序功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大大大大大白呢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值