背景
由于在项目中碰到需要实现 行 拖拽排序,使用的是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) //当前行的被拖拽后的顺序 // 这里就可以写我们需要传给后台的逻辑代码 } }) }
局限性
鼠标在每一行的第一个元素上,拖动时才可以获取到当前行数据
如果你有更好的解决办法,还请你动一下你的小手,留言交流一下。。谢谢大家!