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)

相关推荐
Old Uncle Tom26 分钟前
银行用户画像 -- 金融目标与需求意图
前端·人工智能·金融
IT_陈寒32 分钟前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
东方小月32 分钟前
从0开发一个 Coding Agent(一):前言
前端·人工智能·typescript
恋猫de小郭33 分钟前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
ji_shuke1 小时前
远程排查 Web 系统问题:如何导出 HAR 文件协助定位
前端·问题排查
程序员爱钓鱼1 小时前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
码农学院1 小时前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python
johnny2332 小时前
UI新革命?GenUI、WanDB-OpenUI、thesysdev-OpenUI、A2UI、AG-UI、MCP-UI
ui
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构