Element UI表格拖拽(vue中) —— 行拖拽、列拖拽

简介: Element UI表格拖拽(vue中) —— 行拖拽、列拖拽

安装依赖 vuedraggable

安装  vuedraggable 的同时,会自动安装 sortablejs

npm i -S vuedraggable

或直接安装  sortablejs

npm install sortablejs --save

更多配置参考—— vue.draggable中文文档

http://www.itxst.com/vue-draggable/tutorial.html

实现拖拽的要点

使用class为 draggable 的div 包裹整个表格,以便拖拽代码中,准确抓取到拖拽元素的父容器

行拖拽要点

需在 el-table 标签中,根据行的内容指定行的唯一标识  row-key="id"

列拖拽要点

需额外定义两个数组,分别存储拖拽前的列顺序和拖拽后的列顺序

完整范例代码

<template>
    <div class="draggable" style="padding: 20px">
        <el-table
                row-key="id"
                :data="tableData"
                style="width: 100%"
                border
        >
            <el-table-column
                    v-for="(item,index) in oldList"
                    :key="`col_${index}`"
                    :prop="newList[index].prop"
                    :label="item.label"
                    align="center"
            >
            </el-table-column>
        </el-table>
    </div>
</template>
<script>
    import Sortable from 'sortablejs';
 
    export default {
        mounted() {
            this.oldList = JSON.parse(JSON.stringify(this.tableConfig.tableItems))
            this.newList = JSON.parse(JSON.stringify(this.tableConfig.tableItems))
            this.columnDrop()
            this.rowDrop()
        },
        data() {
            return {
                oldList: [],
                newList: [],
                tableData: [
                    {
                        id:1,
                        name:'李一',
                        gender:'男',
                        age:30,
                        job:"会计"
                    },
                    {
                        id:2,
                        name:'王二',
                        gender:'未知',
                        age:18,
                        job:"无业游民"
                    },
                    {
                        id:3,
                        name:'张三',
                        gender:'男',
                        age:50,
                        job:"老板"
                    },
                ],
                tableConfig: {
                    tableItems: [
                        {
                            label: '姓名',
                            prop: 'name',
                        },
                        {
                            label: '性别',
                            prop: 'gender',
                        },
                        {
                            label: '年龄',
                            prop: 'age',
                        },
                        {
                            label: '工作',
                            prop: 'job',
                        },
                    ]
                }
            }
        },
        methods: {
            // 行拖拽
            rowDrop() {
                // 此时找到的元素是要拖拽元素的父容器
                const tbody = document.querySelector('.draggable .el-table__body-wrapper tbody');
                const _this = this;
                Sortable.create(tbody, {
                    //  指定父元素下可被拖拽的子元素
                    draggable: ".draggable .el-table__row",
                    onEnd({newIndex, oldIndex}) {
                        const currRow = _this.tableData.splice(oldIndex, 1)[0];
                        _this.tableData.splice(newIndex, 0, currRow);
                    }
                });
            },
            // 列拖拽
            columnDrop() {
                const wrapperTr = document.querySelector('.draggable .el-table__header-wrapper tr');
                this.sortable = Sortable.create(wrapperTr, {
                    animation: 180,
                    delay: 0,
                    onEnd: evt => {
                        const oldItem = this.newList[evt.oldIndex];
                        this.newList.splice(evt.oldIndex, 1);
                        this.newList.splice(evt.newIndex, 0, oldItem);
                    }
                });
            }
        }
    }
</script>
<style scoped>
</style>


目录
相关文章
|
14天前
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
85 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
2月前
|
JavaScript
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
14天前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
76 0
|
2月前
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
|
3月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
99 0
|
3月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
195 0
|
3月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
149 0
|
6月前
|
前端开发 搜索推荐 开发者
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
|
6月前
|
JavaScript 前端开发 开发者
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
|
6月前
|
前端开发 JavaScript API
SAP UI5 sap.ui.require.toUrl 的作用介绍
SAP UI5 sap.ui.require.toUrl 的作用介绍