antdesign-vue結(jié)合sortablejs實現(xiàn)兩個table相互拖拽排序功能
實現(xiàn)效果
本來想在網(wǎng)上看看有沒有基于antdesign做的,然后發(fā)現(xiàn)是真的少啊!廢話不多說,先上圖:
sortablejs介紹
首先先來認識一下這個插件: sortablejs
大家可以去細讀一下它的api文檔:
這邊我就著重介紹一下我用到的api。
1.group
可以傳入對象,參數(shù)值為name
,pull
,put
,
name:如果是要兩個列表下進行拖動的話,name的值必須為一樣;
pull:pull用來定義從這個列表容器移動出去的設(shè)置,true/false/‘clone'/function
- true :列表容器內(nèi)的列表單元可以被移出;
- false:列表容器內(nèi)的列表單元不可以被移出;
- clone:列表單元移出,移動的為該元素的副本;
- function:用來進行pull的函數(shù)判斷,可以進行復(fù)雜邏輯,在函數(shù)中return false/true來判斷是否移出;
put:put用來定義往這個列表容器放置列表單元的的設(shè)置,true/false/[‘foo',‘bar']/function;
- true:列表容器可以從其他列表容器內(nèi)放入列表單元;
- false:與true相反;
- [‘foo',‘bar']:這個可以是一個字符串或者是字符串的數(shù)組,代表的是group配置項里定義的name值;
- function:用來進行put的函數(shù)判斷,可以進行復(fù)雜邏輯,在函數(shù)中return false/true來判斷是否放入;
2.animation
ms, number 單位:ms,定義排序動畫的時間;
3. handle
: 格式為簡單css選擇器的字符串,使列表單元中符合選擇器的元素成為拖動的手柄,只有按住拖動手柄才能使列表單元進行拖動(你想讓哪個元素拖動就綁定這個元素的class);
4. onStart:function(evt){}
開始拖拽的回調(diào)方法;
5. onUpdate:function(evt){}
列表內(nèi)元素順序更新的回調(diào)方法;
6. onAdd:function(evt){}
元素從一個列表拖拽到另一個列表的回調(diào)方法;
7. onRemove:function(evt){}
元素從列表中移除進入另一個列表的回調(diào)方法;
這個需求用到這些api也就足夠了。
具體實現(xiàn)
1.第一步先初始化sortable
方法,因為我們的需求是兩個表格拖拽,所以初始化2個方法。
html代碼
<s-table ref="table" size="default" class="left-table" rowKey="key" :columns="columns" :data="loadData"> </s-table> <s-table class="sort-table" ref="table2" size="default" class="left-table" rowKey="key" :columns="columns" :data="loadData"> </s-table>
具體的columns 和loadData就不多余闡述。
JS代碼
import Sortable from 'sortablejs' methods:{ // 初始化 sortable 實現(xiàn)拖動 initSortable () { var that = this var el = this.$el.querySelector('.sort-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, onUpdate: function (evt) { }, // 開始拖拽的時候 onStart: function (evt) { }, onAdd: function (evt) { }, onRemove: function (evt) { } }) }, initSortable1 () { var that = this var el = this.$el.querySelector('.left-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, onUpdate: function (evt) { }, // 開始拖拽的時候 onStart: function (evt) { }, onAdd: function (evt) { }, onRemove: function (evt) { } }) }, }
關(guān)于handle
所取的class,因為我們是要對antdesign表格的每一行進行拖拽,所以要選取到他每一行的class。
至此兩個table之間就可以實現(xiàn)拖拽效果,但僅僅只是拖拽效果。
因為這樣拖拽之后,兩邊的數(shù)據(jù)源并沒有發(fā)生變化,而且明明已經(jīng)拖拽過來之后,另一邊的表格的展示頁會存在錯誤:
排序是我右邊表格特有的,但是這邊的表格是不需要這個排序的,而且如果拖拽成功的話為什么還會顯示暫無數(shù)據(jù)呢,最后左邊表頭的CheckBox
也無法選中。所以到此為止只是有拖拽效果而已。
2.在拖拽動作之后,把左右兩邊的數(shù)據(jù)源重新賦值,這里有兩種實現(xiàn)思路:
- 每一次拖拽之后都去請求后臺數(shù)據(jù),拿到新的數(shù)據(jù)源之后重新賦值給表格,
- 前端自己做好數(shù)據(jù)源的處理,等所有的拖拽結(jié)束之后排好序再給后臺保存。
考慮到性能消耗,我就選擇了第二種:
1)定義左右兩邊的數(shù)據(jù)源數(shù)組
data(){ return{ unMatchedList: [], // 左邊未匹配的數(shù)據(jù) dataList: [], // 右邊已匹配的數(shù)據(jù) pullIndex :'',//原數(shù)組拖拽元素的下標 } }
2)在每一次remove
或者add
的時候更新數(shù)據(jù)源,這里只寫了一個表格拖拽的方法,另一個只要把that.dataList
和that.unMatchedList
左右兩邊的數(shù)據(jù)源賦值調(diào)換一下就行,就不貼重復(fù)代碼了
// 開始拖拽的時候 onStart: function (evt) { that.pullIndex = evt.oldIndex }, onAdd: function (evt) { //evt.newIndex 移入到新數(shù)組的下標 //pullIndex 原數(shù)組拖拽元素的下標 that.dataList.splice(evt.newIndex, 0, that.unMatchedList[that.pullIndex]) that.dataList.forEach((item, index) => { item.sort = index + 1 }) //通知table視圖更新 that.$nextTick(() => { that.$refs.table2 && this.$refs.table2.refresh(true) that.$refs.table && this.$refs.table.refresh(true) }) }, onRemove: function (evt) { that.dataList.splice(evt.oldIndex, 1) that.dataList.forEach((item, index) => { item.sort = index + 1 }) that.$nextTick(() => { that.$refs.table2 && this.$refs.table2.refresh(true) that.$refs.table && this.$refs.table.refresh(true) }) } })
3)實現(xiàn)同一個表格上下拖拽排序
initSortable () { var that = this var el = this.$el.querySelector('.sort-table tbody') Sortable.create(el, { handle: '.ant-table-row', animation: 150, group: { name: 'name', pull: true, put: true }, //這里千萬不要用onEnd 方法 onUpdate: function (evt) { var o = evt.oldIndex var n = evt.newIndex if (o === n) { return } that.sortListAndUpdate(that.dataList, o, n) }, }) }, // 對數(shù)據(jù)進行排序,要求 o(oldIndex) 和 n(newIndex) 從 0開始 sortList (list, o, n) { var newTableData = JSON.parse(JSON.stringify(list)) var data = newTableData.splice(o, 1, null) newTableData.splice(o < n ? n + 1 : n, 0, data[0]) newTableData.splice(o > n ? o + 1 : o, 1) return newTableData }, /** * 對數(shù)據(jù)排序并更新 table, 要求 o(oldIndex) 和 n(newIndex) 從 0開始 */ sortListAndUpdate (list, o, n) { var newTableData = this.sortList(list, o, n) newTableData.forEach((item, index) => { item.sort = index + 1 }) this.$nextTick(() => { this.dataList = newTableData that.$refs.table2 && this.$refs.table2.refresh(true) }) },
這邊我們選用onUpdate
方法來排序,不要用onEnd
方法,因為只要你有拖拽效果,都會去觸發(fā)onEnd
方法,導(dǎo)致左右拖拽完后又會觸發(fā)一次排序。
到此這篇關(guān)于antdesign-vue結(jié)合sortablejs實現(xiàn)兩個table相互拖拽排序功能的文章就介紹到這了,更多相關(guān)antdesign-vue實現(xiàn)拖拽排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue實例的對象參數(shù)options的幾個常用選項詳解
今天小編就為大家分享一篇Vue實例的對象參數(shù)options的幾個常用選項詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11vue3中實現(xiàn)拖拽排序代碼示例(vue-draggable-next的使用)
在Vue3中使用拖拽功能時應(yīng)選用vue-draggable-next插件,傳統(tǒng)的draggable插件不兼容Vue3,可能導(dǎo)致TypeError錯誤,安裝后,需在項目中引入并使用,具體步驟包括安裝插件、引入使用、查看效果和相關(guān)說明,需要的朋友可以參考下2024-09-09打包組件報錯:Error:Cannot?find?module?'vue/compiler-sfc&ap
最近遇到這樣的問題,vue組件庫搭建過程中使用webpack打包組件時報錯,本文給大家分享打包組件報錯:Error:?Cannot?find?module?‘vue/compiler-sfc‘的解決方法,感興趣的朋友一起看看吧2023-12-12Vue使用distpicker插件實現(xiàn)省市級下拉框三級聯(lián)動
這篇文章主要介紹了Vue使用distpicker插件實現(xiàn)省市級下拉框三級聯(lián)動,比如通過JSON文件生成對應(yīng)的區(qū)域下拉框,element-china-are插件,包括distpicker插件,通過代碼講解如何使用distpicker插件實現(xiàn)省市級三聯(lián)跳動,需要的朋友可以參考下2023-02-02vue 解決provide和inject響應(yīng)的問題
這篇文章主要介紹了vue 解決provide和inject響應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11