<transition-group tag="div">
<div
v-for="(item, index) in targetKeys"
:key="index"
ref="list"
class="option-item"
draggable="true"
@dragstart="handleDragStart(item)"
@dragover.prevent="handleDragOver($event)"
@dragenter="handleDragEnter($event, item)"
@dragend="handleDragEnd()"
>
<close-outlined @click="closeTargetKey(item, onItemSelect)" />
<div class="item-info">
<div class="item-title">{{ getStation(item)?.name }}</div>
<div class="item-coord">{{ getStation(item)?.coord }}</div>
</div>
<unordered-list-outlined :style="{ fontSize: '20px' }" />
</div>
</transition-group>
/**
* 拖拽方法块
*/
const dragging = ref();
function handleDragStart(item: any) {
dragging.value = item;
}
function handleDragEnd() {
dragging.value = null;
}
//首先把div变成可以放置的元素,即重写dragenter/dragover
function handleDragOver(e: any) {
e.dataTransfer.dropEffect = 'move'; // e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
}
function handleDragEnter(e: any, item: any) {
e.dataTransfer.effectAllowed = 'move'; //为需要移动的元素设置dragstart事件
if (dragging.value === item) {
return null;
}
const newItems = [...targetKeys.value];
const src = newItems.indexOf(dragging.value);
const dst = newItems.indexOf(item);
newItems.splice(dst, 0, ...newItems.splice(src, 1));
targetKeys.value = newItems;
emits('chageTarget');
}
.option-item {
background: #ebeff3;
border-radius: 2px;
height: 32px;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.item-info {
display: flex;
align-items: center;
justify-content: space-between;
flex: auto;
padding: 0 10px;
.item-title {
font-family: PingFangSC-Regular;
font-size: 14px;
color: #272a33;
}
}
}
该博客介绍了如何在前端使用Vue实现div元素的拖拽功能,允许用户通过拖放操作改变div元素的顺序。主要涉及的事件监听包括dragstart、dragover、dragenter和dragend,以及相应的处理函数,如handleDragStart、handleDragEnd和handleDragEnter。通过修改targetKeys数组来更新div的排列顺序,并触发'chageTarget'事件。
869

被折叠的 条评论
为什么被折叠?



