实现 el-table 拖拽行排序,并获取当前拖拽行的数据传入服务器

4,756 阅读2分钟

背景

由于在项目中碰到需要实现 行 拖拽排序,使用的是element ui库,查阅资料后发现,现在的element ui库中的el-table还不支持行拖拽排序。于是查阅的很多资料,发现是可以使用 sortablejs 实现拖拽的,但是它的拖拽是基于dom的,没有数据改变,而且项目中需要获取当前拖拽行的数据传给后台。。这就有点伤脑筋了,sortablejs 的 drag事件不能获取当前拖拽行的数据,,网友有推荐vuedraggable 的,但是又不想破坏el-table,所有就另寻途径了。。。最终,找到一种了一种解决办法,推荐给大家,当然还有不足之处。。如果你有更好的解决办法,可以交流交流...

sortablejs 实现拖拽

废话不多,直接代码:

    mounted() {
        let el = document.querySelectorAll('.el-table__body-wrapper > table > tbody')[0];
        const sortable = Sortable.create(el, {
            onEnd: evt => { // 监听拖动结束事件
            
            }
        })
    }

具体参数大家可以查阅 sortablejs; 实现拖拽后我们就要获取当前拖拽行的数据了。。

vue 模版中添加事件

首先,我们要在el-table中添加事件:

<el-table :data="datas">
    <el-table-column type="selection" width="55">
        <template slot-scope="scope">
            <button draggable="true" class="move" @dragstart="handleEdit(scope.row)"></button>
        </template>
    </el-table-column>
    
    <el-table-column prop="name" label="名字" width="" sortable>
    </el-table-column>

    <el-table-column prop="name" label="名字" width="" sortable>
    </el-table-column>
    
</el-table>

在type="selection" 行中添加一个拖拽的事件 draggable="true" 这个属性是要启用的

<button draggable="true" class="move" @dragstart="handleEdit(scope.row)"> 然后,到模版的js中定义 handleEdit 方法,获取需要的值,

    methods: {
      handleEdit(val) {
        console.log(val);
        this.id = val.id  //这里就是当前拖动行的值,把需要的值赋值给你之前定义好的就可以了
      }
    },
    mounted() {
      let el = document.querySelectorAll('.el-table__body-wrapper > table > tbody')[0];
      const sortable = Sortable.create(el, {
        onEnd: evt => {  //监听拖动结束事件
          let proId = this.id; //就是我们上面获取到当前行的id值
          console.log(evt.oldIndex) //当前行的被拖拽前的顺序
          console.log(evt.newIndex) //当前行的被拖拽后的顺序
          // 这里就可以写我们需要传给后台的逻辑代码
        }
      })
    }

局限性

鼠标在每一行的第一个元素上,拖动时才可以获取到当前行数据

如果你有更好的解决办法,还请你动一下你的小手,留言交流一下。。谢谢大家!