Vue element表格实现拖动排序(sortable)

最近在项目中表格列表需要实现拖动排序,用到的是 sortable.js 这款插件,是一款优秀的js拖拽库,不依赖jQuery。支持 Meteor、AngularJS、React、Vue、Knockout框架和任何CSS库,如Bootstrap、Element UI。可以用来拖拽div、table等元素。

安装:

npm install sortablejs

然后在 js 中引入这个插件:

import Sortable from "sortablejs"

表格加上 row-key 和 ref:

<el-table row-key="tableData" ref="singleTable" :data="list" style="width: 100%;">

注:row-key 写不正确可能会出现一些BUG,唯一就可以

具体实现:

mounted(){
	this.dragSort();
},
methods:{
	//表格拖动排序
	dragSort() {
		const el = this.$refs.singleTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]
		this.sortable = Sortable.create(el, {
			onEnd: e => {	//onEnd是结束拖拽时触发,onUpdate是列表内元素顺序更新的时候触发,更多请看文末配置项
				//e.oldIndex为拖动一行原来的位置,e.newIndex为拖动后新的位置
				const targetRow = this.tableData.splice(e.oldIndex, 1)[0];
				this.tableData.splice(e.newIndex, 0, targetRow);
				let dragId = this.tableData[e.newIndex].id;//拖动行的id
				let oneId,twoId
				//拖动行的前一行
				if( this.tableData[e.newIndex-1]){
					oneId = this.tableData[e.newIndex-1].id;
				}else {
					oneId = ""
				}
				//拖动行的后一行
				if( this.tableData[e.newIndex+1]){
					twoId = this.tableData[e.newIndex+1].id;}
				else {
					twoId = ""
				}
				console.log("拖动行:"+dragId);
				console.log("前一行:"+oneId);
				console.log("后一行:"+twoId);
				//然后就可以发送请求了......
			}
		})
	}
					
}

配置项:

http://www.sortablejs.com/options.html 可以更改排序动画时间、自定义影子样式、指定拖动元素、多列表同组等等

其他:

如果使用的不是表格,而是以 v-for 的形式生成的动态数据,并且出现了排序混乱等BUG,可以尝试把数据源换成原本数据源的副本看看,注意不是基本类型要用深拷贝

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现表格的拖拽排序,可以使用以下步骤: 1. 给表格中需要排序的行添加拖拽事件监听器。 2. 在拖拽开始时,记录被拖拽的行的索引。 3. 在拖拽过程中,使用一些视觉效果(比如改变背景颜色)来提示用户当前处于哪一行。 4. 在拖拽结束时,将被拖拽的行移动到目标位置,并更新表格数据。 下面是一个简单的实现示例: HTML: ```html <table id="sortable-table"> <thead> <tr> <th>名称</th> <th>数量</th> <th>价格</th> </tr> </thead> <tbody> <tr><td>苹果</td><td>10</td><td>5</td></tr> <tr><td>香蕉</td><td>15</td><td>3</td></tr> <tr><td>橙子</td><td>8</td><td>4</td></tr> <tr><td>梨子</td><td>12</td><td>6</td></tr> </tbody> </table> ``` JavaScript: ```javascript // 获取表格元素 const table = document.getElementById('sortable-table'); // 获取所有可拖拽的行 const rows = table.tBodies[0].rows; // 记录被拖拽的行的索引 let draggingIndex = -1; // 给所有可拖拽的行添加事件监听器 for (let i = 0; i < rows.length; i++) { const row = rows[i]; // 记录当前行的索引 row.draggingIndex = i; // 添加拖拽事件监听器 row.addEventListener('dragstart', e => { // 记录被拖拽的行的索引 draggingIndex = e.target.draggingIndex; // 设置拖拽效果 e.dataTransfer.effectAllowed = 'move'; // 设置拖拽数据 e.dataTransfer.setData('text/html', row.innerHTML); }); // 添加拖拽过程中的事件监听器 row.addEventListener('dragover', e => { // 阻止默认行为,使得drop事件能够触发 e.preventDefault(); // 设置拖拽效果 e.dataTransfer.dropEffect = 'move'; // 获取当前鼠标所在的位置 const y = e.clientY - table.offsetTop; // 遍历所有行,找到当前鼠标所在的位置应该插入的位置 for (let j = 0; j < rows.length; j++) { const row = rows[j]; if (y > row.offsetTop && y < row.offsetTop + row.offsetHeight) { // 如果拖拽的行和目标行不是同一行,则交换位置 if (draggingIndex !== j) { table.tBodies[0].insertBefore(rows[draggingIndex], j > draggingIndex ? rows[j] : rows[j + 1]); break; } } } }); // 添加拖拽结束的事件监听器 row.addEventListener('dragend', e => { // 重置被拖拽的行的索引 draggingIndex = -1; }); } ``` 在这个示例中,我们使用了HTML5的拖拽API来实现表格的拖拽排序。在拖拽过程中,我们通过改变被拖拽的行和目标行的位置来实现排序。需要注意的是,这个示例只是一个简单的实现,如果需要支持更复杂的排序方式,比如拖拽多个行或者跨页排序,还需要进行更多的功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值