Vue3使用vuedraggable實(shí)現(xiàn)拖拽排序功能實(shí)例代碼
安裝依賴
npm install vuedraggable@next
引入組件
import draggable from 'vuedraggable'
基礎(chǔ)用法
<template>
<draggable v-model="innerList" item-key="props" handle=".sort-icon" :disabled="false" :animation="300">
<template #item="{ element }">
<div class="flexAlign">
<div class="sort-icon" style="margin-right: 5px;cursor: pointer;font-size: 18px;">?</div>
{{ element.label }}
</div>
</template>
</draggable>
</template>
<script setup>
import draggable from 'vuedraggable';
const innerList = ref([
{label:"名稱"}
])
</script>
常用屬性說(shuō)明
| 屬性名 | 類型 | 說(shuō)明 |
|---|---|---|
?v-model? | Array | 綁定數(shù)組,拖拽后自動(dòng)更新順序 |
?item-key? | String | 每個(gè) item 的唯一 key |
?tag? | String | 渲染的容器標(biāo)簽,默認(rèn)div? |
?group? | String/Object | 分組設(shè)置,支持跨列表拖拽 |
?disabled? | Boolean | 是否禁用拖拽 |
?handle? | String | 拖拽手柄選擇器 |
?animation? | Number | 拖拽的動(dòng)畫過(guò)渡時(shí)間 |
事件名
| 事件名 | 說(shuō)明 | 參數(shù) |
|---|---|---|
?@start? | 拖拽開(kāi)始 | ?event? |
?@end? | 拖拽完成 | ?event? |
?@change? | 列表順序發(fā)生變化 | ?{ moved: { oldIndex, newIndex } }? |
?@add? | 從別的列表添加到當(dāng)前 | ?event? |
?@remove? | 當(dāng)前列表被移除元素 | ?event? |
實(shí)戰(zhàn)進(jìn)階場(chǎng)景
拖拽手柄限制(只能通過(guò)圖標(biāo)拖動(dòng))
<draggable v-model="list" item-key="id" handle=".sort-icon">
<template #item="{ element }">
<div>
<span class="sort-icon">?</span>
{{ element.name }}
</div>
</template>
</draggable>
禁用某項(xiàng)拖動(dòng)
<draggable v-model="list" item-key="id" :move="checkMove" @change="logChange">
</draggable>
<script setup>
const checkMove = (e) => {
return !e.draggedContext.element.fixed
}
const logChange = (e) => console.log(e)
</script>
跨列表拖拽
<draggable v-model="list1" item-key="id" group="all"> ... </draggable> <draggable v-model="list2" item-key="id" group="all"> ... </draggable>
也可以使用對(duì)象方式更靈活控制:
group="{ name: 'all', pull: true, put: true }"
嵌套拖拽(如樹(shù)形結(jié)構(gòu))
<draggable v-model="tabList" item-key="id">
<template #item="{ element }">
<div>{{ element.name }}</div>
<draggable
v-if="element.children"
v-model="element.children"
item-key="id"
:group="{ name: 'all' }"
>
<template #item="{ element }">
<div class="child">{{ element.name }}</div>
</template>
</draggable>
</template>
</draggable>
示例:拖拽后保存順序
<el-button @click="save">保存順序</el-button>
<draggable v-model="list" item-key="id" @end="save" />
<script setup>
const save = () => {
console.log('新順序:', list.value.map(i => i.id))
}
</script>
常見(jiàn)問(wèn)題排查
拖不動(dòng)?
- 是否設(shè)置了
item-key? - 是否被 CSS 覆蓋了事件(例如 overflow、position)
- 是否啟用了
disabled? 屬性
- 是否設(shè)置了
拖動(dòng)異常(閃爍/跳動(dòng))?
- 確保子項(xiàng)具有穩(wěn)定的
key? - 不要在拖拽中操作 DOM
- 確保子項(xiàng)具有穩(wěn)定的
樣式塌陷?
- 添加必要的
min-height?、border? 保持布局正常
- 添加必要的
總結(jié)
到此這篇關(guān)于Vue3使用vuedraggable實(shí)現(xiàn)拖拽排序功能的文章就介紹到這了,更多相關(guān)Vue3 vuedraggable拖拽排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)PC端錄音功能的實(shí)例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)PC端錄音功能的實(shí)例代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
詳解如何實(shí)現(xiàn)在Vue中導(dǎo)入Excel文件
這篇文章主要介紹了如何在Vue中導(dǎo)入Excel文件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-01-01
vue.js學(xué)習(xí)筆記之v-bind和v-on解析
這篇文章主要介紹了vue.js學(xué)習(xí)筆記之v-bind和v-on解析,v-bind 指令用于響應(yīng)地更新 HTML 特征,v-on 指令用于監(jiān)聽(tīng)DOM事件,文中還給大家提到了v-bind,v-on的縮寫,感興趣的朋友參考下吧2018-05-05
vue使用smooth-signature實(shí)現(xiàn)移動(dòng)端橫豎屏電子簽字
這篇文章主要為大家介紹了vue使用smooth-signature實(shí)現(xiàn)移動(dòng)端橫豎屏電子簽字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
詳解Vue如何實(shí)現(xiàn)自定義動(dòng)畫與動(dòng)畫效果設(shè)計(jì)
在Vue中,動(dòng)畫效果是非常有用的,它可以使用戶界面變得更加生動(dòng)、有趣,本文中我們將學(xué)習(xí)如何在Vue中進(jìn)行自定義動(dòng)畫與動(dòng)畫效果設(shè)計(jì),感興趣的可以了解一下2023-06-06
Vue.set()動(dòng)態(tài)的新增與修改數(shù)據(jù),觸發(fā)視圖更新的方法
今天小編就為大家分享一篇Vue.set()動(dòng)態(tài)的新增與修改數(shù)據(jù),觸發(fā)視圖更新的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue導(dǎo)出excel多層表頭的實(shí)現(xiàn)方案詳解
這篇文章主要為大家詳細(xì)介紹了vue導(dǎo)出excel多層表頭的實(shí)現(xiàn)方案,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
vue中提示$index is not defined錯(cuò)誤的解決方式
這篇文章主要介紹了vue中提示$index is not defined錯(cuò)誤的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vuex+axios+element-ui實(shí)現(xiàn)頁(yè)面請(qǐng)求loading操作示例
這篇文章主要介紹了vuex+axios+element-ui實(shí)現(xiàn)頁(yè)面請(qǐng)求loading操作,結(jié)合實(shí)例形式分析了vuex+axios+element-ui實(shí)現(xiàn)頁(yè)面請(qǐng)求過(guò)程中l(wèi)oading遮罩層相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-02-02
vue 搭建后臺(tái)系統(tǒng)模塊化開(kāi)發(fā)詳解
這篇文章主要介紹了vue 搭建后臺(tái)系統(tǒng)模塊化開(kāi)發(fā)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05

