欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

antdesign-vue結(jié)合sortablejs實現(xiàn)兩個table相互拖拽排序功能

 更新時間:2021年01月08日 15:01:16   作者:心中有曲自然嗨丶  
這篇文章主要介紹了antdesign-vue結(jié)合sortablejs實現(xiàn)兩個table相互拖拽排序功能,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

實現(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.dataListthat.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的幾個常用選項詳解

    今天小編就為大家分享一篇Vue實例的對象參數(shù)options的幾個常用選項詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue3中實現(xiàn)拖拽排序代碼示例(vue-draggable-next的使用)

    vue3中實現(xiàn)拖拽排序代碼示例(vue-draggable-next的使用)

    在Vue3中使用拖拽功能時應(yīng)選用vue-draggable-next插件,傳統(tǒng)的draggable插件不兼容Vue3,可能導(dǎo)致TypeError錯誤,安裝后,需在項目中引入并使用,具體步驟包括安裝插件、引入使用、查看效果和相關(guān)說明,需要的朋友可以參考下
    2024-09-09
  • Vue-component全局注冊實例

    Vue-component全局注冊實例

    今天小編就為大家分享一篇Vue-component全局注冊實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue實現(xiàn)簡易購物車頁面

    Vue實現(xiàn)簡易購物車頁面

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)簡易購物車頁面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Vue.js?中的父子組件通信方式實例教程

    Vue.js?中的父子組件通信方式實例教程

    在 Vue.js 中,父子組件通信是非常重要的,在本文中,我們討論了 Vue.js 中父子組件通信的幾種方式,包括使用 props 傳遞數(shù)據(jù)、使用 Sync 修飾符實現(xiàn)雙向綁定、使用自定義事件傳遞數(shù)據(jù)、使用 $refs 訪問子組件實例以及使用 $children 和 $parent 訪問父子組件實例
    2023-09-09
  • vue組件的路由高亮問題解決方法

    vue組件的路由高亮問題解決方法

    這篇文章主要給大家介紹了關(guān)于vue組件的路由高亮問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 打包組件報錯:Error:Cannot?find?module?'vue/compiler-sfc'

    打包組件報錯:Error:Cannot?find?module?'vue/compiler-sfc&ap

    最近遇到這樣的問題,vue組件庫搭建過程中使用webpack打包組件時報錯,本文給大家分享打包組件報錯:Error:?Cannot?find?module?‘vue/compiler-sfc‘的解決方法,感興趣的朋友一起看看吧
    2023-12-12
  • Vue使用distpicker插件實現(xiàn)省市級下拉框三級聯(lián)動

    Vue使用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-02
  • Vue動態(tài)組件component的深度使用說明

    Vue動態(tài)組件component的深度使用說明

    這篇文章主要介紹了Vue動態(tài)組件component的深度使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue 解決provide和inject響應(yīng)的問題

    vue 解決provide和inject響應(yīng)的問題

    這篇文章主要介紹了vue 解決provide和inject響應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論