拖拽排序原理与实现分析
分析
- 鼠标在某一行中按下
- 移动鼠标位置
- 产生对应的替换样式
- 鼠标抬起,表格行顺序发生变化
依据以上的业务,那么实现该功能的核心就在于:监听鼠标事件,完成对应的 UI 视图处理
具体来说:
- 监听鼠标的按下事件
- 监听鼠标的移动事件
- 生成对应的 UI 样式
- 监听鼠标的抬起事件
整个 拖动排序 的核心实现,就是围绕着 sortablejs 这个lib来进行的
那么以此,我们得出最终的实现方案:
- 利用 sortablejs 实现表格拖拽功能
- 在拖拽完成后,调用接口完成排序
实现
安装:npm i sortablejs@1.14.0
import {
ref
} from 'vue'
import Sortable from 'sortablejs'
import i18n from '@/i18n'
import {
articleSort
} from '@/api/article'
import {
ElMessage
} from 'element-plus'
// 排序相关
export const tableRef = ref(null)
/**
* 初始化排序
*/
export const initSortable = (tableData, cb) => {
// 获取tbody的DOM
const el = tableRef.value.$el.querySelectorAll(
'.el-table__body-wrapper > table > tbody'
)[0]
// 1. 要拖拽的元素
// 2. 配置对象
Sortable.create(el, {
// 拖拽时类名
ghostClass: 'sortable-ghost',
// 拖拽结束的回调方法
async onEnd(event) {
// 获取发生改变的行之前与现在的index
const {
newIndex,
oldIndex
} = event
// 修改数据
await articleSort({
initRanking: tableData.value[oldIndex].ranking,
finalRanking: tableData.value[newIndex].ranking
})
ElMessage.success({
message: i18n.global.t('msg.article.sortSuccess'),
type: 'success'
})
// 直接重新获取数据无法刷新 table!!
tableData.value = []
// 重新获取数据
cb && cb()
}
})
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App