el-tabel实现拖拽排序

1、使用npm安装sortableJs插件

javascript 复制代码
npm install sortablejs --save

2、在需要使用的页面进行引入

javascript 复制代码
import Sortable from 'sortablejs'

3、表格拖拽排序完整代码

javascript 复制代码
<template>
    <div class="home">
        <el-table :data="tableData" style="width: 100%">
            <el-table-column v-for="(item, index) in col" :key="`col_${index}`" :prop="item.prop" :label="item.label">
            </el-table-column>
        </el-table>
    </div>
</template>

<script setup>
import Sortable from 'sortablejs'; //引入插件
import { onMounted, ref, nextTick } from 'vue';
const col = ref([
    {
        label: '日期',
        prop: 'date'
    },
    {
        label: '姓名',
        prop: 'name'
    },
    {
        label: '地址',
        prop: 'address'
    }
]);

const tableData = ref([
    {
        date: '2016-05-03',
        name: '建筑电工',
        address: '天河区'
    },
    {
        date: '2016-05-02',
        name: '管道工',
        address: '番禺区'
    },
    {
        date: '2016-05-04',
        name: '木工',
        address: '越秀区'
    },
    {
        date: '2016-05-01',
        name: '架子工',
        address: '海珠区'
    }
]);

onMounted(() => {
    // 阻止默认行为
    document.body.ondrop = function (event) {
        event.preventDefault();
        event.stopPropagation();
    };
    rowDrop();
    columnDrop();
});
//行拖拽
const rowDrop = () => {
    const tbody = document.querySelector('.el-table__body-wrapper tbody');
    Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
            if (newIndex == oldIndex) return;
            tableData.value.splice(newIndex, 0, tableData.value.splice(oldIndex, 1)[0]);
            const newArray = tableData.value.slice(0);
            tableData.value = [];
            nextTick(function () {
                tableData.value = newArray;
            });
        }
    });
};
//列拖拽
const columnDrop = () => {
    const wrapperTr = document.querySelector('.el-table__header-wrapper tr');
    Sortable.create(wrapperTr, {
        animation: 180,
        delay: 0,
        onEnd: (evt) => {
            const oldItem = col.value[evt.oldIndex];
            col.value.splice(evt.oldIndex, 1);
            col.value.splice(evt.newIndex, 0, oldItem);
            const newArray = col.value.slice(0);
            col.value = [];
            nextTick(function () {
                col.value = newArray;
            });
        }
    });
};
</script>

<style scoped>
.home {
    font-size: 36px;
}
</style>

4、列表的拖拽排序

列表拖拽排序一般只用在行的拖拽排序,此处我们依旧可以使用sortableJs来实现拖拽排序的功能,具体代码如下

javascript 复制代码
<template>
    <div class="home">
        <div style="width: 800px">
            <ul id="items">
                <li v-for="item in listData" :key="item.id" class="item">
                    {{ item.name }}
                </li>
            </ul>
        </div>
    </div>
</template>

<script setup>
import Sortable from 'sortablejs'; //引入插件
import { onMounted, ref, nextTick } from 'vue';
const listData = ref([
    {
        id: 1,
        name: '数据一'
    },
    {
        id: 2,
        name: '数据二'
    },
    {
        id: 3,
        name: '数据三'
    },
    {
        id: 4,
        name: '数据四'
    }
]);
onMounted(() => {
    // 阻止默认行为
    document.body.ondrop = function (event) {
        event.preventDefault();
        event.stopPropagation();
    };
    rowDrop();
});
//行拖拽
const rowDrop = () => {
    const tbody = document.getElementById('items');
    Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
            if (newIndex == oldIndex) return;
            listData.value.splice(newIndex, 0, listData.value.splice(oldIndex, 1)[0]);
            const newArray = listData.value.slice(0);
            listData.value = [];
            nextTick(function () {
                listData.value = newArray;
                console.log(listData.value);
            });
        }
    });
};
</script>

<style scoped>
.item {
    border: 1px solid #a7a2a2;
    padding: 10px;
}
</style>

参考:拖拽排序(el-table)

相关推荐
hunterandroid7 小时前
HarmonyOS WebSocket 实战:断线重连、心跳保活与连接状态机设计
前端
hunterandroid7 小时前
StateFlow 与 SharedFlow 的边界:状态与事件的正确建模
android·前端
心念科技7 小时前
1、搜索表单 xnSearch(基于:心念后台,后端 Java 21 + Spring Boot 4 + Spring Cloud,前端提供 ReactVue3+TS、Vue3+JS、Vue2+JS
前端
计算机魔术师8 小时前
Dwarkesh Patel 对 OpenAI/Hugging Face 事件的爆款解读被指危险误导
前端
自进化Agent智能体9 小时前
Hermes GitHub PR 审查 —— 自动化代码评审
前端
涛涛ing11 小时前
OpenAI Astra 泄露:零样本生成 3D 网页,前端开发者慌了吗?
前端
ssshooter11 小时前
现在网页都能提供 MCP 了?!
前端·人工智能·程序员
杉氧11 小时前
状态管理变迁史:为什么我们放弃了 Redux 选择 Zustand?
android·前端·react native
cidy_9811 小时前
OpenCode 手动配置火山方舟 Agent Plan 教程
前端
鹏多多11 小时前
PC 网站接入微信登录,这 10 个坑我替你踩完了!
前端·javascript·vue.js