vue实现简单拖拽
Vue 实现简单拖拽功能
在 Vue 中实现拖拽功能可以通过 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种常见的实现方式:
使用 HTML5 拖放 API
HTML5 提供了原生的拖放 API,结合 Vue 的事件绑定可以快速实现拖拽功能。
<template>
<div>
<!-- 拖拽源 -->
<div
draggable="true"
@dragstart="handleDragStart"
class="draggable-item"
>
拖拽元素
</div>
<!-- 放置目标 -->
<div
@dragover.prevent
@drop="handleDrop"
class="drop-target"
>
放置区域
</div>
</div>
</template>
<script>
export default {
methods: {
handleDragStart(e) {
// 设置拖拽数据
e.dataTransfer.setData('text/plain', '拖拽数据');
},
handleDrop(e) {
// 获取拖拽数据
const data = e.dataTransfer.getData('text/plain');
console.log('拖拽数据:', data);
}
}
};
</script>
<style>
.draggable-item {
width: 100px;
height: 100px;
background: lightblue;
cursor: move;
}
.drop-target {
width: 200px;
height: 200px;
background: lightgray;
margin-top: 20px;
}
</style>
关键点:
draggable="true"标记元素为可拖拽。@dragstart事件在拖拽开始时触发,用于设置拖拽数据。@dragover.prevent阻止默认行为以允许放置。@drop事件在元素放置时触发,用于处理拖拽数据。
使用 vuedraggable 库
对于更复杂的拖拽需求(如列表排序),可以使用 vuedraggable 库。

-
安装
vuedraggable:npm install vuedraggable -
示例代码:

<template> <div> <draggable v-model="list" @end="onDragEnd" class="list-container" > <div v-for="item in list" :key="item.id" class="list-item"> {{ item.text }} </div> </draggable> </div> </template>
export default { components: { draggable }, data() { return { list: [ { id: 1, text: '项目 1' }, { id: 2, text: '项目 2' }, { id: 3, text: '项目 3' } ] }; }, methods: { onDragEnd() { console.log('拖拽后的列表:', this.list); } } };
.list-container { width: 200px; }.list-item { padding: 10px; margin: 5px; background: lightgreen; cursor: move; }
```关键点:
v-model绑定列表数据,拖拽后自动更新。@end事件在拖拽结束时触发,可用于监听变化。vuedraggable支持更多高级功能(如动画、跨列表拖拽等)。
选择建议
- 简单拖拽:使用 HTML5 原生 API。
- 复杂场景(如列表排序、嵌套拖拽):优先选择
vuedraggable。






