一: 安装sortablejs
npm install sortablejs --save

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

rowdrag方法:
// 行拖拽
const rowdrag = function () {
// 要拖拽元素的父容器
const tbody = document.queryselector(
".draggable .el-table__body-wrapper tbody"
);
if (!tbody) return;
sortable.create(tbody as htmlelement, {
// 可被拖拽的子元素
draggable: ".draggable .el-table__row",
onend(event: sortableevent) {
if (event.oldindex !== undefined && event.newindex !== undefined) {
const currrow = tablelist.splice(event.oldindex, 1)[0];
tablelist.splice(event.newindex, 0, currrow);
}
},
});
};效果如下:
图标不能使用,自己可以更换了,这个无所谓啦。

三 : 下面是封装成组件使用
还不够完善,可以根据自己的需求进行修改。
dragtable 组件代码如下:
<template>
<div class="t-table" ref="table_ref">
<el-table
class="draggable"
ref="tables"
:data="state.tabledata"
row-key="id"
border
fit
highlight-current-row
style="width: 100%"
>
<!-- 拖拽 -->
<el-table-column align="center" label="" width="80">
<template #default="{}">
<i-ep-fold style="cursor: move" />
</template>
</el-table-column>
<template v-for="item in state.tableheaders" :key="item.id">
<el-table-column
:property="item.property"
:min-width="item.width"
align="center"
show-overflow-tooltip
>
<template #header>
<p style="margin: 0; display: flex; justify-content: center">
{{ item.label }}
</p>
</template>
</el-table-column>
</template>
</el-table>
</div>
</template>
<script setup lang="ts" name="dragtable">
import { ref, watch, reactive, onmounted } from "vue";
import { default as sortable, sortableevent } from "sortablejs";
const props = defineprops<{
// 列表数据
table: any;
// 表头数据
headers: {
id: string;
property: string;
width: string;
label: string;
show: boolean;
}[];
}>();
// 初始化数据
const state = reactive({
tabledata: props.table,
tableheaders: props.headers,
});
// 获取el-table ref
const tables: any = ref<htmlelement | null>(null);
// 获取t-table ref
const table_ref: any = ref<htmlelement | null>(null);
// 抛出事件 在 应用的.vue 文件做相应的操作
const emits = defineemits(["rowsort"]);
// 监听移动的 表格数据 重新赋值
watch(
() => props.table,
(val) => {
console.log("watch val", val);
state.tabledata = val;
},
{ deep: true }
);
onmounted(() => {
console.log("state.tabledata >>>", state.tabledata);
console.log("state.tableheaders >>>", state.tableheaders);
initsort();
});
// 行拖拽
const initsort = () => {
const el = table_ref.value.queryselector(".el-table__body-wrapper tbody");
// console.log('3333', el)
sortable.create(el, {
animation: 150, // 动画
onend: (event: sortableevent) => {
if (event.oldindex !== undefined && event.newindex !== undefined) {
const currow = state.tabledata.splice(event.oldindex, 1)[0];
state.tabledata.splice(event.newindex, 0, currow);
emits("rowsort", state.tabledata);
}
},
});
};
</script>
在 .vue 文件中的使用 及 页面父传子的数据
1. 导入组件
import dragtable from "@/components/dragtable/index.vue";
2. 使用组件
<dragtable :table="tablelist" :headers="initialheaders" @rowsort="handlerowsort" />
3. 在 .vue 文件里的数据及方法
列表数据就根据自己后端返回的数据直接传递就行。
表头数据如下:
let initialheaders = reactive([
{
id: "1",
property: "id",
width: "88",
label: "id",
show: true,
},
{
id: "2",
property: "name",
width: "121",
label: "111",
show: true,
},
{
id: "3",
property: "thumb",
width: "139",
label: "222",
show: true,
},
{
id: "4",
property: "icon",
width: "99",
label: "333",
show: true,
},
]);handlerowsort() 这个事件每次更改列表的排序就会触发,在使用组件的 .vue 文件上就能进行一些相应的需求操作
const handlerowsort = () => {
console.log("应用的.vue 文件做相应的操作");
};组件使用的效果图如下:
样式可以根据自己需求进行调整,这个小问题啦,功能实现就好。

总结
到此这篇关于vue3+el-plus实现表格行拖拽功能的文章就介绍到这了,更多相关vue3+el-plus表格行拖拽功能内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论