• element+sortablejs插件实现拖拽排序效果


    背景
    1、后台管理系统中表格需要实现行拖拽功能
    2、表格使用element组件库中el-table

    方案介绍

    1、Sortable.js
    介绍:Sortable.js是一款轻量级的拖放排序列表的js插件
    引用自官方文档:No jQuery required. Supports Meteor, AngularJS, React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.
    参考地址: https://github.com/SortableJS/Sortable

    2、vuedraggable
    介绍:基于Sortable.js的vue组件,用以实现拖拽功能
    引用自官方文档:Vue drag-and-drop component based on Sortable.js
    参考地址: https://github.com/SortableJS/Vue.Draggable

    遇到的问题
    在使用vuedraggable的过程中,发现必须用包裹拖动项的父级元素,但是element组件库对table进行封装,无法直接包裹拖动项(即tr)的父级元素

    如果你的项目中,表格未使用组件库,实现可以参考 https://www.jb51.net/article/162648.htm

    解决方案
    使用 sortable.js
    步骤一: 安装

    npm install sortablejs --save

    步骤二:引入(在main中全局引入或者需要的组件页面引入)

    import Sortable from 'sortablejs' //按需引入

    步骤三: el-table 添加row-key属性

    <el-table :data="data" border class="table" row-key="id" ref="dragTable" highlight-current-row>
        <el-table-column prop="id" label="序号" align="center">
        </el-table-column>
        <el-table-column prop="title" label="标题" align="center">
        </el-table-column>
    </el-table>

    步骤四 : 将拖拽元素设置为要拖动项的父级元素

    mounted() {
        // 表格中需要实现行拖动,所以选中tr的父级元素
        const table = document.querySelector('.el-table__body-wrapper tbody')
        const self = this
        Sortable.create(table, {
            onEnd({ newIndex, oldIndex }) {
                console.log(newIndex, oldIndex)
                const targetRow = self.resourceList.splice(oldIndex, 1)[0]
                self.resourceList.splice(newIndex, 0, targetRow)
            }
        })
    }

    plan b:

    mounted(){
        this.setSort();//拖拽
    },
    methods: {
        setSort(){
            // 表格中需要实现行拖动,所以选中tr的父级元素
            const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0] // table
            this.sortable = Sortable.create(el,{
                ghostClass:'sortable-ghost',
                setData:function(dataTransfer){
                    dataTransfer.setData('Text', '')
                },
                onEnd: evt => {
                    // console.log(this.data) //:data="data" 所有数据
                    const targetRow = this.data.splice(evt.oldIndex, 1)[0]; // this.data是表格所有数据
                    // console.log(targetRow) // 挪动是单个数据
                    this.data.splice(evt.newIndex, 0, targetRow);
                }
            })
        },
    }

    借鉴文章:https://www.zhangshengrong.com/p/2EaE06yO1M/

  • 相关阅读:
    判断回溯法中的标记数组vis在回溯的时候是否要取消标记?
    Linux多线程开发I
    答题小程序开发
    答题活动小程序
    今天来谈谈答题小程序的上下游生态
    挑战答题小程序V2.0
    可以免费出题的答题小程序
    挑战答题小程序上线了
    通过小程序反编译来谈谈小程序的分包加载机制?
    本文介绍下答题小程序V6.0
  • 原文地址:https://www.cnblogs.com/xiong88/p/12420228.html
Copyright © 2020-2023  润新知