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)

相关推荐
EricWang13581 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
September_ning1 分钟前
React.lazy() 懒加载
前端·react.js·前端框架
web行路人11 分钟前
React中类组件和函数组件的理解和区别
前端·javascript·react.js·前端框架
超雄代码狂33 分钟前
ajax关于axios库的运用小案例
前端·javascript·ajax
长弓三石42 分钟前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
小马哥编程43 分钟前
【前端基础】CSS基础
前端·css
不秃头的UI设计师1 小时前
UI界面设计入门:打造卓越用户体验
ui·ux·ui设计
嚣张农民1 小时前
推荐3个实用的760°全景框架
前端·vue.js·程序员
周亚鑫1 小时前
vue3 pdf base64转成文件流打开
前端·javascript·pdf
Justinc.2 小时前
CSS3新增边框属性(五)
前端·css·css3