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

44 篇文章 14 订阅

目录

安装依赖 vuedraggable

实现拖拽的要点

行拖拽要点

列拖拽要点

完整范例代码

安装依赖 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>

  • 20
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
VueElement UI 都提供了一些内置的指令和组件,可以方便地实现拖拽功能。下面是一个简单的示例: 1. 安装 Element UIVue 项目使用 Element UI,需要先安装 Element UI: ``` npm install element-ui -S ``` 2. 引入 Element UIVue 项目的入口文件引入 Element UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 创建一个可拖拽表格 使用 Element UI 的 `el-table` 组件创建一个表格,并添加 `el-table-column` 组件来定义表格。在每一的 `header` 添加 `draggable` 属性,并绑定一个事件处理函数。 ```html <template> <div class="drag-table"> <el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange"> <el-table-column type="index" label="序号" width="50"></el-table-column> <el-table-column label="名称" prop="name" header-draggable @header-dragend="handleHeaderDragEnd"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> <el-table-column label="地址" prop="address"></el-table-column> </el-table> </div> </template> ``` 在 `handleHeaderDragEnd` 方法,获取拖拽结束后的表头位置信息,并根据位置信息重新排表格的顺序。 ```javascript export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京市海淀区' }, { name: '李四', age: 20, address: '上海市浦东新区' }, { name: '王五', age: 22, address: '广州市天河区' }, { name: '赵六', age: 24, address: '深圳市南山区' } ] } }, methods: { handleHeaderDragEnd(newWidth, oldWidth, column, event) { const tableEl = event.target.closest('.el-table') const headerCells = tableEl.querySelectorAll('.el-table__header-wrapper th') const newColumns = [] Array.from(headerCells).forEach((cell, index) => { const prop = cell.getAttribute('data-prop') const column = this.$refs.table.store.states._columns.find(c => c.property === prop) if (column) { newColumns.push(column) } }) this.$refs.table.store.commit('setColumns', newColumns) }, handleSortChange() { // 排序后需要重新计算的位置 this.$nextTick(() => { const headerCells = this.$el.querySelectorAll('.el-table__header-wrapper th') Array.from(headerCells).forEach((cell, index) => { cell.setAttribute('data-index', index) }) }) } } } ``` 4. 添加样式 为了让表格能够拖拽,还需要添加一些样式: ```css .drag-table .el-table__header-wrapper th { cursor: move; } .drag-table .el-table__header-wrapper th.dragging { opacity: 0.5; } ``` 至此,我们已经完成了一个简单的可拖拽表格。当用户拖拽表头时,表格的位置会随之改变。需要注意的是,这个示例只实现了表头拖拽的功能,如果需要实现拖拽的功能,可以参考 Vue 官方提供的 sortable.js 插件。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝阳39

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值