Vue中靈活拖拽的前端神器VueDraggablePlus的用法詳解
VueDraggablePlus是一個功能齊全、無縫遷移、靈活使用的拖拽組件,完全繼承了Sortable.js的所有功能,支持Vue 3和Vue 2,使用TypeScript編寫并提供完整的TS文檔,支持雙向綁定和自定義容器,可以通過組件、指令或函數(shù)式調(diào)用實現(xiàn)拖拽功能。
官網(wǎng): alfred-skyblue.gitee.io/vue-draggable-plus/
場景化引入:解決拖拽列表痛點
在日常開發(fā)中,我們經(jīng)常會遇到需要實現(xiàn)拖拽列表的需求,但是傳統(tǒng)的方法往往需要將拖拽功能作為列表的直接子元素來實現(xiàn),這在一些情況下會受到限制。比如,當(dāng)我們使用一些組件庫時,如果組件庫中沒有提供列表根元素的插槽,我們就很難實現(xiàn)拖拽列表。這時,VueDraggablePlus就派上了用場!它可以讓你在任何元素上使用拖拽列表,通過指定元素的選擇器,來獲取到列表根元素,然后將列表根元素作為拖拽容器,輕松實現(xiàn)拖拽功能。
安裝
npm install vue-draggable-plus
<template>
<VueDraggable ref="el" v-model="list">
<div v-for="item in list" :key="item.id">
{{ item.name }}
</div>
</VueDraggable>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
const list = ref([
{
name: 'Joao',
id: 1
},
{
name: 'Jean',
id: 2
},
{
name: 'Johanna',
id: 3
},
{
name: 'Juan',
id: 4
}
])
</script>

alfred-skyblue.gitee.io/vue-draggable-plus
使用說明:多種用法靈活選擇
VueDraggablePlus提供了多種使用方式,您可以根據(jù)自己的需求選擇最適合的方式來實現(xiàn)拖拽功能。您可以使用組件的方式,在需要拖拽的元素上直接添加VueDraggablePlus組件;也可以使用函數(shù)的方式,通過調(diào)用函數(shù)來實現(xiàn)拖拽功能;還可以使用指令的方式,通過指定元素的選擇器來實現(xiàn)拖拽功能??傆幸豢钸m合您!
<template>
<div
v-draggable="[
list,
{
animation: 150,
}
]"
>
<div
v-for="item in list"
:key="item.id"
>
{{ item.name }}
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { vDraggable } from 'vue-draggable-plus'
const list = ref([
{
name: 'Joao',
id: 1
},
{
name: 'Jean',
id: 2
},
{
name: 'Johanna',
id: 3
},
{
name: 'Juan',
id: 4
}
])
function onStart() {
console.log('start')
}
function onUpdate() {
console.log('update')
}
</script>
這里我們使用了VueDraggablePlus組件的方式來實現(xiàn)拖拽列表,將列表項包裹在VueDraggablePlus組件內(nèi),即可輕松實現(xiàn)拖拽功能。
解決痛點:完美繼承Sortable.js功能
VueDraggablePlus完全繼承了Sortable.js的所有功能,讓您可以盡情享受拖拽的樂趣。無論是拖拽排序、拖拽上傳還是拖拽調(diào)整布局,VueDraggablePlus都可以輕松應(yīng)對,讓您的前端開發(fā)更加便捷高效。
演示:多種場景應(yīng)用
VueDraggablePlus不僅功能強大,而且還支持多種場景的應(yīng)用。比如雙列表拖拽、克隆、自定義克隆、指定元素觸發(fā)、指定目標(biāo)容器、內(nèi)置動畫合并等,為您的項目提供了更多的可能性。
組件參數(shù)和事件
參數(shù)
| 參數(shù) | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| animation | 拖動時顯示動畫 | Number | 0 |
| chosenClass | 被選中項的 CSS 類名 | String | 'sortable-chosen' |
| delay | 選中拖拽延時 | Number | 0 |
| delayOnTouchOnly | touch 事件延遲 | Number | 0 |
| direction | 拖拽方向,默認(rèn)自動判斷??蛇x值有horizontal 和 vertical | String | - |
| disabled | 是否禁止拖拽 | Boolean | false |
| dragClass | 拖拽項類名 | String | 'sortable-drag' |
| draggable | 指定元素內(nèi)的哪些項目應(yīng)該是可拖動的 | String | - |
| emptyInsertThreshold | 拖動時鼠標(biāo)必須與空可排序項的距離(以像素為單位),以便將拖動元素插入到該可排序項中, 設(shè)置為0禁用此功能。 | Number | 5 |
| easing | 簡化動畫。 | Easing | - |
| fallbackClass | 當(dāng)使用forceFallback的時候,被復(fù)制的dom的css類名 | String | sortable-fallback |
| fallbackOnBody | 將cloned DOM 元素掛到body元素上。 | Boolean | false |
| fallbackTolerance | 以像素為單位指定鼠標(biāo)在被視為拖動之前應(yīng)該移動多遠(yuǎn)。 | Number | 0 |
| filter | 不需要進(jìn)行拖動的元素 | String | - |
| forceFallback | 忽略 HTML5拖拽行為,強制回退 | Boolean | false |
| ghostClass | drop placeholder的css類名 | String | 'sortable-ghost' |
| group | 要將元素從一個列表拖到另一個列表中,兩個列表必須具有相同的group 值。您還可以定義列表是否可以被移出、或者克隆以及接收其他列表元素。詳情查閱上方TS類型定義 | Group | - |
| handle | 設(shè)置可拖拽句柄的css類名,如果不設(shè)置,默認(rèn)對目標(biāo)元素的子列表操作進(jìn)行拖拽 | String | - |
| invertSwap | 如果設(shè)置為 true,將始終使用反向交換區(qū) | Boolean | false |
| invertedSwapThreshold | 反向交換閾值,默認(rèn)情況下將設(shè)置為swapThreshold 值 | Number | - |
| preventOnFilter | 觸發(fā)filter時調(diào)用event.preventDefault() | Boolean | true |
| removeCloneOnHide | 刪除不顯示的克隆元素,而不是僅僅隱藏它 | Boolean | true |
| sort | 定義列表單元是否可以在列表容器內(nèi)進(jìn)行拖拽排序 | Boolean | true |
| swapThreshold | 交換區(qū)的閾值 | Number | 1 |
| touchStartThreshold | 在取消延遲拖動事件之前點應(yīng)該移動多少像素 | Number | 1 |
| setData | 傳遞一個函數(shù),函數(shù)的第一個參數(shù)為DataTransfer類型,第二個參數(shù)為HTMLElement 類型 | Function | - |
| scroll | 是否啟用滾動 | Boolean or HTMLElement | true |
| scrollFn | 自定義滾動 | ScrollFn | - |
| scrollSensitivity | 鼠標(biāo)必須離邊緣多近才能開始滾動,單位 px | Number | - |
| scrollSpeed | 滾動速度(ms/px) | Number | - |
| bubbleScroll | 將自動滾動應(yīng)用于所有父元素,以便更輕松地移動 | Boolean | true |
事件函數(shù)
| 事件函數(shù)名稱 | 說明 | 類型 |
|---|---|---|
| onChoose | 元素被選中時觸發(fā) | ((event: SortableEvent) => void) |
| onUnchoose | 元素取消選中時觸發(fā) | ((event: SortableEvent) => void) |
| onStart | 拖拽開始時觸發(fā) | ((event: SortableEvent) => void) |
| onEnd | 拖拽結(jié)束時觸發(fā) | ((event: SortableEvent) => void) |
| onAdd | 元素從一個列表拖拽到另一個列表時觸發(fā) | ((event: SortableEvent) => void) |
| onUpdate | 元素順序更新時觸發(fā) | ((event: SortableEvent) => void) |
| onSort | 列表任何更改都會觸發(fā) | ((event: SortableEvent) => void) |
| onRemove | 元素從列表中移除時觸發(fā) | ((event: SortableEvent) => void) |
| onFilter | 拖拽一個被過濾元素時觸發(fā) | ((event: SortableEvent) => void) |
| onMove | 拖拽移動時觸發(fā) | ((event: MoveEvent,originalEvent: Event) => void) |
| onClone | 克隆一個元素時觸發(fā) | ((event: SortableEvent) => void) |
| onChange | 拖拽元素改變位置時觸發(fā) | `((event: SortableEvent) => |
示例
通過 監(jiān)聽 onStart 事件, 將當(dāng)前選中項的背景設(shè)置為白透明的白色。
其中 SortableEvent 的 item 即當(dāng)前拖拽項, 通過改變它的 style 即可。
通過 監(jiān)聽 onEnd 事件, 在拖拽結(jié)束時 ,將當(dāng)前選中項的背景顏色還原。
<template>
<VueDraggable ref="el" v-model="list" @start="onStart" @end="onEnd">
<div v-for="item in list" :key="item.id" class="drag-item">
<NodejsButton :title="item.name" />
</div>
</VueDraggable>
</template>
<script setup>
import { ref } from 'vue'
import NodejsButton from '@/components/button/nodejs-button.vue'
import { VueDraggable } from 'vue-draggable-plus'
const list = ref([
{
name: 'Aoooooo',
id: 1
},
{
name: 'Boooooo',
id: 2
},
{
name: 'Coooooo',
id: 3
},
{
name: 'Doooooo',
id: 4
}
])
const onStart = (e) => {
e.item.style.backgroundColor = '#ffffff22'
}
const onEnd = () => {}
</script>
<style>
.drag-item {
width: 240px;
margin-bottom: 15px;
cursor: grab;
&:last-of-type {
margin-bottom: 0;
}
}
</style>

結(jié)語
通過本文的介紹,相信大家已經(jīng)對VueDraggablePlus有了初步的了解。作為前端工程師,掌握這樣一款功能強大、靈活易用的前端組件,將會為您的項目開發(fā)帶來很大的便利??靵韲L試一下吧,讓拖拽功能變得更加簡單愉快!
到此這篇關(guān)于Vue中靈活拖拽的前端神器VueDraggablePlus的用法詳解的文章就介紹到這了,更多相關(guān)Vue VueDraggablePlus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue按住shift鍵多選方式(以element框架的table為例)
這篇文章主要介紹了vue按住shift鍵多選方式(以element框架的table為例),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
vue3+vite實現(xiàn)在線預(yù)覽pdf功能
這篇文章主要為大家詳細(xì)介紹了如何通過vue3和vite實現(xiàn)在線預(yù)覽pdf功能,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10

