vue列表拖拽排序功能實現

2022-01-19 02:37:40 字數 2277 閱讀 9201

1.實現目標:目標是輸入乙個陣列,生成乙個列表;通過拖拽排序,拖拽結束後輸出乙個經過排序的陣列。

2.實現思路:

2.1是使用html5的drag功能來實現,每次拖拽時直接操作dom節點排序,拖拽結束後再根據實際的dom節點遍歷得出新的陣列。

2.2使用mousedown,mouseover等滑鼠事件來實現,每次監聽事件時,僅改動列表項的樣式transform,而不操作實際的dom順序。拖拽結束時,根據transform計算陣列項順序,得出新陣列用vue資料驅動的方式重繪列表,重置所有樣式。

總的來說就是可以通過不同的監聽事件(drag、mouseover),按不同的順序操作dom(1.先操作實際dom,再新增動畫,在輸出陣列;2。不操作實際dom,僅改變transfrom,得出新陣列,用新陣列生成新列表來更新節點)。

3.實際**

3.1第一種實現

html部分。(被拖拽的元素需要設定draggable=true,否則不會有效果)

@dragstart="ondragstart"

@dragover="ondragover"

@dragend="ondragend"

ref="parentnode">}

拖拽事件有兩個物件(被拖拽物件和目標物件)。dragstart 事件: 當拖拽元素開始被拖拽的時候觸發的事件,此事件作用在被拖拽元素上。dragover事件:當拖拽元素穿過目標元素時候觸發的事件,此事件作用在目標元素上。

在拖拽事件開始時,將本次拖拽的物件儲存到變數中。每當dragover事件,將目標物件儲存到變數中,新增判斷當目標物件和拖拽物件為不同的列表項時,交換兩個dom元素的先後順序。

ondragstart(event),    

ondragover(event));

console.log(data)

},_index(el)

現在基本效果有了,然後是新增動畫。新增動畫的方式是通過transform實現。

因為每次拖拽排序觸發時都會改變dom結構,為了實現移動的效果,可以在每次排序時先將dom節點恢復通過transform到原來的位置,使得表現上還是排序前的狀態。然後新增transition,同時置空transform實現移動效果。(這裡需要重繪才能觸發效果,否則兩次transform會直接抵消掉,可以使用settimeout或者ele.offsetwidth來觸發重繪),transform的偏移量可以通過改變節點順序前後的距頂高度來獲得。

完整**:

@dragstart="ondragstart"

@dragover="ondragover"

@dragend="ondragend"

ref="parentnode">}

data: ,

mounted ()

},methods:,

ondragover(event)

}if(this._index(this.draging)dom.style.transition="transform .3s";

dom.style.transform=``;

//觸發重繪

// settimeout(()=>,0)

cleartimeout(dom.animated);

dom.animated=settimeout(()=>,300)

},ondragend(event));

console.log(data)

},_index(el)}})

3.2.第二種實現

mousedown的時候記錄下拖拽項和拖拽項初始位置,mouseover的時候將拖拽項和目標項交換位置,新增transform,mouseup的時候遍歷出新陣列來更新檢視。這種方式就是動畫不好加,個人瞎琢磨的,應該是思路錯誤了,放著看看吧。

ref="parentnode"

@mouseover="onmouseover"

@mouseup="onmouseup">"

>}

data: ,

mounted ()

document.onmouseup=()=>;

},computed:,

itemheight()

},methods:,

onmouseover(event)

drag.style.transform=`translatey($px)`;

target.style.transform=`translatey($px)`;}}

},onmouseup()}})

UWP 拖拽列表項的排序功能實現

首先,我們需要讓冰箱的大門敞開,也就是允許我們進行拖拽的相關操作。以listview為例,注意下面幾個屬性。1 stackpanel 2 listview x name list 3allowdrop true 4canreorderitems true 5isswipeenabled true 6...

php介面實現拖拽排序功能

列表拖拽排序是乙個很常見的功能,但是後端介面如何處理卻是乙個令人糾結的問題 如何實現才能達到效率最高呢?先分析乙個場景,假如有乙個頁面有十條資料,所謂的拖拽就是在這十條資料來來回回的拖,但是每次拖動都會影響到其他資料例如把最後一條拖到最前面,那麼後面九條就自動往後移,反之也是,嗯 先想象一下,排序號...

在 Rails 中實現拖拽排序功能

首先,如果你使用了 webpack,那麼你可以在 package.json 中新增 jquery ui 1.12.1 如果沒有使用 webpack,那麼在 gemfile 檔案中新增 gem jquery ui rails import jquery ui ui widgets sortable 或...