vue實(shí)現(xiàn)元素拖動(dòng)并互換位置的實(shí)現(xiàn)代碼
項(xiàng)目場(chǎng)景:
在使用Vue的場(chǎng)景下,需要實(shí)現(xiàn)對(duì)元素進(jìn)行拖動(dòng)交換位置。

需求分析:
1、兩兩交換的其實(shí)是數(shù)組的下標(biāo)。數(shù)據(jù)內(nèi)容不變。
2、拖拽功能需要用到一下API。
| 方法名 | 詳解 |
|---|---|
ondraggable | 設(shè)置元素是否允許被拖動(dòng)。鏈接和圖片默認(rèn)是可拖動(dòng),因此不用設(shè)置該屬性 |
ondragstart | 用戶開始拖動(dòng)元素或選擇的文本時(shí)觸發(fā)。 |
ondragover | 拖動(dòng)元素或選取的文本正在拖動(dòng)到放置目標(biāo)時(shí)觸發(fā)。默認(rèn)情況下,數(shù)據(jù)/元素不能放置到其他元素中。如果要實(shí)現(xiàn)改功能,我們需要防止元素的默認(rèn)處理方法。我們可以通過(guò)調(diào)用 event.preventDefault() 方法來(lái)實(shí)現(xiàn) ondragover 事件。 |
ondragenter | 當(dāng)被鼠標(biāo)拖動(dòng)的對(duì)象進(jìn)入其容器范圍內(nèi)時(shí)觸發(fā)此事件 |
ondragend | 用戶完成元素拖動(dòng)后觸發(fā) |
關(guān)于更多的API介紹可以看點(diǎn)這里
代碼實(shí)現(xiàn):
<table>
<thead>
<tr>
<th>標(biāo)題1</th>
<th>標(biāo)題2</th>
<th>標(biāo)題3</th>
</tr>
</thead>
<tbody>
<tr v-for="(items,index) in dataList" :key="index"
draggable="true"
@dragstart="handleDragStart($event, items)"
@dragover.prevent="handleDragOver($event, items)"
@dragenter="handleDragEnter($event, items)"
@dragend="handleDragEnd($event, items)"
>
<td>{{items.content}}</td>
</tr>
</tbody>
</table>
<script>
var VM = new Vue({
el:'#app',
data:function(){
return {
dataList:[{
content:'內(nèi)容'
},{
content:'內(nèi)容'
},{
content:'內(nèi)容'
}],
dragging: null
}
},
methods:{
handleDragStart(e,items){
this.dragging = items;//開始拖動(dòng)時(shí),暫時(shí)保存當(dāng)前拖動(dòng)的數(shù)據(jù)。
},
handleDragEnd(e,items){
this.dragging = null;//拖動(dòng)結(jié)束后,清除數(shù)據(jù)
},
handleDragOver(e) {
e.dataTransfer.dropEffect = 'move';//在dragenter中針對(duì)放置目標(biāo)來(lái)設(shè)置!
},
handleDragEnter(e,items){
e.dataTransfer.effectAllowed = "move";//為需要移動(dòng)的元素設(shè)置dragstart事件
if(items == this.dragging) return;
var newItems = [...this.dataList];//拷貝一份數(shù)據(jù)進(jìn)行交換操作。
var src = newItems.indexOf(this.dragging);//獲取數(shù)組下標(biāo)
var dst = newItems.indexOf(items);
newItems.splice(dst, 0, ...newItems.splice(src, 1));//交換位置
this.dataList = newItems;
}
}
})
</script>關(guān)于Array.prototype.splice()
到此這篇關(guān)于vue實(shí)現(xiàn)元素拖動(dòng)并互換位置的文章就介紹到這了,更多相關(guān)vue元素拖動(dòng)互換位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3-print-nb的使用,點(diǎn)擊回調(diào)問(wèn)題
解決TypeScript錯(cuò)誤需在env.d.ts配置代碼,頁(yè)面布局需用百分比匹配設(shè)計(jì)稿元素,父級(jí)組件應(yīng)正確應(yīng)用樣式2025-07-07
windows下vue.js開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了windows下vue.js開發(fā)環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Vue3項(xiàng)目中reset.scss模板使用導(dǎo)入
這篇文章主要為大家介紹了Vue3項(xiàng)目中reset.scss模板使用導(dǎo)入示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
從0到1解鎖Element-Plus組件二次封裝El-Dialog動(dòng)態(tài)調(diào)用的原理解析
作者通過(guò)二次封裝Element-Plus的el-dialog組件,實(shí)現(xiàn)動(dòng)態(tài)顯示與數(shù)據(jù)傳遞功能,提升項(xiàng)目靈活性和代碼復(fù)用性,適用于用戶編輯、文件上傳確認(rèn)、權(quán)限管理等多場(chǎng)景需求,本文給大家介紹從0到1解鎖Element-Plus組件二次封裝El-Dialog動(dòng)態(tài)調(diào)用的原理解析,感興趣的朋友一起看看吧2025-07-07
關(guān)于Vue3中element-plus的el-dialog對(duì)話框無(wú)法顯示的問(wèn)題及解決方法
最近今天在寫一個(gè)停車場(chǎng)管理系統(tǒng)的項(xiàng)目時(shí),在用vue3寫前端時(shí),在前端模板選擇上,我一時(shí)腦抽,突然決定放棄SpringBoot,選擇了以前幾乎很少用的element-plus,然后果不其然,錯(cuò)誤連連,下面給大家分享dialog對(duì)話框無(wú)法顯示的原因,感興趣的朋友一起看看吧2023-10-10
Vue移動(dòng)端實(shí)現(xiàn)pdf/excel/圖片在線預(yù)覽
這篇文章主要為大家詳細(xì)介紹了Vue移動(dòng)端實(shí)現(xiàn)pdf/excel/圖片在線預(yù)覽功能的相關(guān)方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2024-04-04

