翼度科技»论坛 编程开发 JavaScript 查看内容

Vue3+El-Plus实现表格行拖拽功能完整代码

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一: 安装sortablejs
  1. npm install sortablejs --save
复制代码


二: 页面使用

这里项目只需要一个地方用到,就没有封装成组件,直接在用到的.vue文件中写了。
在使用的 .Vue 文件中导入
  1. import { default as Sortable, SortableEvent } from "sortablejs";
复制代码
看下图:
注意事项:el-table需要配置  row-key 且保持唯一性,不然会出现排序不对的情况

rowDrag方法:
  1. // 行拖拽
  2. const rowDrag = function () {
  3.   // 要拖拽元素的父容器
  4.   const tbody = document.querySelector(
  5.     ".draggable .el-table__body-wrapper tbody"
  6.   );
  7.   if (!tbody) return;
  8.   Sortable.create(tbody as HTMLElement, {
  9.     //  可被拖拽的子元素
  10.     draggable: ".draggable .el-table__row",
  11.     onEnd(event: SortableEvent) {
  12.       if (event.oldIndex !== undefined && event.newIndex !== undefined) {
  13.         const currRow = tableList.splice(event.oldIndex, 1)[0];
  14.         tableList.splice(event.newIndex, 0, currRow);
  15.       }
  16.     },
  17.   });
  18. };
复制代码
效果如下:
图标不能使用,自己可以更换了,这个无所谓啦。


三 : 下面是封装成组件使用

还不够完善,可以根据自己的需求进行修改。
dragTable  组件代码如下:
  1. <template>
  2.   <div class="t-table" ref="table_ref">
  3.     <el-table
  4.       class="draggable"
  5.       ref="tables"
  6.       :data="state.tableData"
  7.       row-key="id"
  8.       border
  9.       fit
  10.       highlight-current-row
  11.       style="width: 100%"
  12.     >
  13.       <!-- 拖拽 -->
  14.       <el-table-column align="center" label="" width="80">
  15.         <template #default="{}">
  16.           <i-ep-fold style="cursor: move" />
  17.         </template>
  18.       </el-table-column>
  19.       <template v-for="item in state.tableHeaders" :key="item.id">
  20.         <el-table-column
  21.           :property="item.property"
  22.           :min-width="item.width"
  23.           align="center"
  24.           show-overflow-tooltip
  25.         >
  26.           <template #header>
  27.             <p style="margin: 0; display: flex; justify-content: center">
  28.               {{ item.label }}
  29.             </p>
  30.           </template>
  31.         </el-table-column>
  32.       </template>
  33.     </el-table>
  34.   </div>
  35. </template>
  36. <script setup lang="ts" name="dragTable">
  37. import { ref, watch, reactive, onMounted } from "vue";
  38. import { default as Sortable, SortableEvent } from "sortablejs";
  39. const props = defineProps<{
  40.   // 列表数据
  41.   table: any;
  42.   // 表头数据
  43.   headers: {
  44.     id: string;
  45.     property: string;
  46.     width: string;
  47.     label: string;
  48.     show: boolean;
  49.   }[];
  50. }>();
  51. // 初始化数据
  52. const state = reactive({
  53.   tableData: props.table,
  54.   tableHeaders: props.headers,
  55. });
  56. // 获取el-table ref
  57. const tables: any = ref<HTMLElement | null>(null);
  58. // 获取t-table ref
  59. const table_ref: any = ref<HTMLElement | null>(null);
  60. // 抛出事件 在 应用的.Vue 文件做相应的操作
  61. const emits = defineEmits(["rowSort"]);
  62. // 监听移动的 表格数据 重新赋值
  63. watch(
  64.   () => props.table,
  65.   (val) => {
  66.     console.log("watch val", val);
  67.     state.tableData = val;
  68.   },
  69.   { deep: true }
  70. );
  71. onMounted(() => {
  72.   console.log("state.tableData >>>", state.tableData);
  73.   console.log("state.tableHeaders >>>", state.tableHeaders);
  74.   initSort();
  75. });
  76. // 行拖拽
  77. const initSort = () => {
  78.   const el = table_ref.value.querySelector(".el-table__body-wrapper tbody");
  79.   // console.log('3333', el)
  80.   Sortable.create(el, {
  81.     animation: 150, // 动画
  82.     onEnd: (event: SortableEvent) => {
  83.       if (event.oldIndex !== undefined && event.newIndex !== undefined) {
  84.         const curRow = state.tableData.splice(event.oldIndex, 1)[0];
  85.         state.tableData.splice(event.newIndex, 0, curRow);
  86.         emits("rowSort", state.tableData);
  87.       }
  88.     },
  89.   });
  90. };
  91. </script>
复制代码
在 .Vue 文件中的使用 及 页面父传子的数据
1. 导入组件
  1. import dragTable from "@/components/DragTable/index.vue";
复制代码
2. 使用组件
  1. <dragTable
  2.   :table="tableList"
  3.   :headers="initialHeaders"
  4.   @rowSort="handleRowSort"
  5. />
复制代码
3. 在 .Vue 文件里的数据及方法
列表数据就根据自己后端返回的数据直接传递就行。
表头数据如下:
  1. let initialHeaders = reactive([
  2.   {
  3.     id: "1",
  4.     property: "id",
  5.     width: "88",
  6.     label: "ID",
  7.     show: true,
  8.   },
  9.   {
  10.     id: "2",
  11.     property: "name",
  12.     width: "121",
  13.     label: "111",
  14.     show: true,
  15.   },
  16.   {
  17.     id: "3",
  18.     property: "thumb",
  19.     width: "139",
  20.     label: "222",
  21.     show: true,
  22.   },
  23.   {
  24.     id: "4",
  25.     property: "icon",
  26.     width: "99",
  27.     label: "333",
  28.     show: true,
  29.   },
  30. ]);
复制代码
handleRowSort() 这个事件每次更改列表的排序就会触发,在使用组件的 .Vue 文件上就能进行一些相应的需求操作
  1. const handleRowSort = () => {
  2.   console.log("应用的.Vue 文件做相应的操作");
  3. };
复制代码
组件使用的效果图如下:
样式可以根据自己需求进行调整,这个小问题啦,功能实现就好。


总结

到此这篇关于Vue3+El-Plus实现表格行拖拽功能的文章就介绍到这了,更多相关Vue3+El-Plus表格行拖拽功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/javascript/320948c0z.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具