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)

相关推荐
不想有bug的小菜鸟6 分钟前
vue3使用iframe全屏展示pdf效果
前端·pdf
m0_748238637 分钟前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
u0100559608 分钟前
前端代理,解决跨域问题讲解
前端
quitv13 分钟前
react脚手架配置别名
前端·javascript·react.js
m0_5287238122 分钟前
前端如何进行性能优化
前端·性能优化
化作繁星23 分钟前
在 Vue 3 中,如何缓存和复用动态组件
前端·vue.js·缓存
一粒沙-43 分钟前
iOS 将GIF图分享至微信
前端·ios
graywen1 小时前
从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
前端
Gazer_S2 小时前
【现代前端框架中本地图片资源的处理方案】
前端·javascript·chrome·缓存·前端框架
林的快手4 小时前
CSS默认样式
前端·css·vue.js·chrome·css3