2025-02-11 vue3拖拽元素案例——来自deepseek
<template>
<div class="parent">
<div
v-for="(item, index) in items"
:key="item.id"
class="child"
draggable="true"
@dragstart="onDragStart(index)"
@dragover.prevent="onDragOver(index)"
@drop="onDrop(index)"
>
{{ item.text }}
</div>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const items = ref([
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' },
{ id: 3, text: 'Item 3' },
{ id: 4, text: 'Item 4' },
{ id: 5, text: 'Item 5' },
]);
let draggedIndex = null;
const onDragStart = (index) => {
draggedIndex = index;
};
const onDragOver = (index) => {
if (draggedIndex === null) return;
const draggedItem = items.value[draggedIndex];
items.value.splice(draggedIndex, 1);
items.value.splice(index, 0, draggedItem);
draggedIndex = index;
};
const onDrop = () => {
draggedIndex = null;
};
return {
items,
onDragStart,
onDragOver,
onDrop,
};
},
};
</script>
<style>
.parent {
display: flex;
flex-wrap: nowrap;
gap: 10px;
}
.child {
padding: 20px;
background-color: #f0f0f0;
border: 1px solid #ccc;
cursor: grab;
}
</style>
-
draggable="true": 使子元素可拖拽。 -
@dragstart: 当开始拖拽时,记录当前拖拽的元素的索引。 -
@dragover.prevent: 当拖拽的元素经过其他元素时,阻止默认行为,并交换元素的位置。 -
@drop: 当松开鼠标时,完成拖拽操作。
vue3自带了dragstart、dragover、drop事件,使得拖拽逻辑更简单

浙公网安备 33010602011771号