Vue.js結合SortableJS實現樹形數據拖拽
需求
表格實現行拖拽,要求只支持同級拖拽!
實現
使用插件:SortableJS,可以參考官網配置項!
// 安裝 npm install sortablejs --save // 引入 import Sortable from 'sortablejs';
//my-table組件中
// 排序功能
setDragSort() {
//獲取需要添加拖拽的組件
const el =
this.$refs.elTable &&
this.$refs.elTable.$el.querySelector(
'.el-table__body-wrapper > table > tbody'
)
// 判斷是props傳遞的參數(是否開啟拖拽,拖拽結束的方法,拖拽的組件)是否存在
if (this.draggable && this.onDragEnd && el) {
if (this.dragSort) this.dragSort.destroy() // 防止在Dom上重復綁定事件
this.dragSort = sortablejs.create(el, {
onEnd: (evt) => this.onDragEnd(evt),
handle: this.handle ? `.${this.handle}` : '', // 可以拖拽的手柄,傳入的為類名
filter: '.el-input, .el-textarea', // 過濾器,不需要進行拖動的元素
preventOnFilter: false, // 在觸發(fā)過濾器`filter`的時候調用`event.preventDefault()`
ghostClass: 'sortable-ghost'
})
}
}
避坑(樹形結構導致下標錯亂)
如上代碼,就可以在頁面進行推拽了,但是因為是樹形結構,所以拖拽結束的時候拿到的下標可能或錯亂,這個時候就需要將數據打平,在進行拿值。
// 將樹數據轉化為平鋪數據
treeToTile(treeData, childKey = 'children') {
const arr = []
const expanded = data => {
if (data && data.length > 0) {
data.filter(d => d).forEach(e => {
arr.push(e)
expanded(e[childKey] || [])
})
}
}
// 拖拽結束
async handleNodeDrag(evt) {
const { newIndex, oldIndex } = evt
// 把樹形的結構轉為列表再進行處理
const activeRows = this.treeToTile(this.table.data)
const oldData = activeRows[oldIndex]
const newData = activeRows[newIndex]
},通過平鋪之后就可以正常拿到拖拽前后的正確的下標了,這樣就可以進行下一步的操作了(提交更改到后端-->重新獲取數據-->渲染頁面)
避坑(樹形結構導致拖拽父級子級數據不跟隨父級移動)

如上圖,拖拽之后子級數據并沒有跟隨父級,這樣就導致頁面顯示不正確,解決方法:首先想到的當然既然已經拖拽成功,那么肯定直接像后端獲取數據來進行表格的刷新,但是試了一下表格并沒有更新,因為我只是改變了順序,其他所有內容都沒有變,就導致Vue是通過虛擬DOM的比較來進行頁面的更新,所以頁面并不會因為獲取了數據而更新,所以這時候就需要對key值進行操作了。
// 方法1 $forceUpdate 需要謹慎使用。 原因:它會強制整個組件的渲染,如果頻度沒有控制好,會一直渲染,導致應用性能變得很低?。?不過我用的不生效,不知道為啥) // 方法2 this.key = Symbol(new Date().toString()) 簡單粗暴,直接給生成新的唯一值?。?!太有效果了
至此,表格刷新完成,但是新的BUG隨之而來....
避坑(刷新表格導致抖動)

如上圖,這樣的問題,暫時沒想到什么好的辦法,我直接加上了Loading掩蓋,解決之后如下,如此效果會稍微好一點,如果有更好的方法還望大家不吝賜教!

平級數據拖拽
平級數據拖拽不存在上面遇到的任何問題,正常寫就好,展示一下:

小結
到此這篇關于Vue.js結合SortableJS實現樹形數據拖拽的文章就介紹到這了,更多相關Vue.js樹形數據拖拽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3?element?plus?table?selection展示數據,默認選中功能方式
這篇文章主要介紹了vue3?element?plus?table?selection展示數據,默認選中功能方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
vue使用動態(tài)組件手寫Router View實現示例
這篇文章主要為大家介紹了vue使用動態(tài)組件手寫RouterView實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Vue.js監(jiān)聽select2的值改變進行查詢方式
這篇文章主要介紹了Vue.js監(jiān)聽select2的值改變進行查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
uniapp?APP中內嵌webview的H5與APP相互通訊動態(tài)傳參代碼示例
最近外部公司的app要接入我司的uni H5項目,所以這篇文章主要給大家介紹了關于uniapp?APP中內嵌webview的H5與APP相互通訊動態(tài)傳參的相關資料,需要的朋友可以參考下2024-04-04

