Sortable.js实现可拖拽Table组件
目标
vue项目中实现一个可拖拽的Table组件,并保存拖拽后的顺序
安装Sortable
$ npm install sortablejs --save
代码实现
创建DragableTable.vue文件,定义template和props
引入依赖
import Sortable from 'sortablejs';
定义table对象
data() {
return {
table: {
isDragging: false, // 是否正在被拖拽
oldIndex: 0, // 原索引
newIndex: 0, // 新索引
draggingRecord: [] // 拖拽记录
}
}
}
ref定位排序容器,Sortable.create初始化可排序对象,绑定onStart和onEnd事件
Sortable.create('id_of_container',[options]);
mounted() {
var el = this.$refs.table.$children[1].$el.children[1];
let vm = this;
Sortable.create(el, {
onStart: vm.handleOnstart,
onEnd: vm.handleOnend
});
}
定义handleOnStart和handleOnEnd方法,并抛出on-drag-change事件
handleOnstart(el) {
this.table.oldIndex = el.oldIndex;
this.table.isDragging = true;
},
handleOnend(el) {
this.table.newIndex = el.newIndex;
this.table.isDragging = false;
this.table.draggingRecord.unshift({
from: this.table.oldIndex,
to: this.table.newIndex
});
this.$emit('on-drag-change', el.oldIndex, el.newIndex);
}
拖拽Table组件基本完成
使用
引入DragableTable组件并注册
import dragTable from '@/components/dragTable';
export default {
components: {
dragTable
}
}
定义DOM
实现dragChange方法
tableData中已有numbers属性表示行数据的索引位置,我们需要计算移动行的newNumbers,即新的位置
由于numbers字段在库中是以1开始的,如果要按0开始需要修改下面的代码
/**
* 拖拽排序
* @param oldIndex 拖拽原索引 newIndex 拖拽目标索引
*/
dragChange(oldIndex, newIndex) {
let data = https://www.it610.com/article/this.tableData;
for (let i = 0;
i < data.length;
i++) {
// 原索引小于目标索引时,中间数据前移一位,原索引移到目标索引
if (oldIndex < newIndex) {
if (i < oldIndex || i> newIndex) {
data[i].newNumbers = i + 1;
} else if (i === oldIndex) {
data[i].newNumbers = newIndex + 1;
} else {
data[i].newNumbers = i;
}
} else {
// 原索引大于目标索引时,中间数据后移一位,原索引移到目标索引
if (i < newIndex || i > oldIndex) {
data[i].newNumbers = i + 1;
} else if (i === oldIndex) {
data[i].newNumbers = newIndex + 1;
} else {
data[i].newNumbers = i + 2;
}
}
}
// 根据newNumbers判断行数据是否被移动,若移动刷新数组数据
let _tableData = https://www.it610.com/article/[];
for (let j = 0;
j < data.length;
j++) {
_tableData[data[j].newNumbers - 1] = data[j];
}
this.tableData = _tableData;
},
【Sortable.js实现可拖拽Table组件】最后,我们发送请求,将移动过的行数据的newNumbers替换numbers,存入库中即可
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM