在vue实现dom的拖拽

项目场景:

拖拽包裹视频组件的dom,实现交换视频的位置。


<div v-for="index in 16" 
    :key="index" 
    :id="divId(index)" 
    class="videoClass" 
    style="border: 1px solid #EBEBEB" 
    draggable="true" 
    @dragstart="handleDragStart(videos[index - 1], index-1)" 
    @dragover="handleDragOver($event)"
    @drop="handleDrop(videos[index - 1], index-1)" 
>
    <CommonVideo 
        :id="videoId(index)" 
        :video="videos[index - 1]" 
        ref="videoRef" 
    >
    </CommonVideo>
</div>
// js部分
fromData: any = null
fromIndex: number = -1

divId(index: number) {
    return "video_" + this.id + (index - 1);
}

videoId(index: number) {
    return "VideoObjectId_" + this.id + (index - 1);
}

created() {
	this.init()
}

init() {
    for (let i = 0; i < 16; i++) {
    	// getDefaultVideo()为默认的video对象
        this.videos.push(getDefaultVideo());
    }
    this.videos = deepCopy(this.videos)
}

// 交换videos数组中的拖拽文件与目标文件的位置和数据
handleDragStart(data, index) {
    this.fromData = data
    this.fromIndex = index
}

// 放置交换位置后的两个数据
handleDrop(data, index) {
    this.$set(this.videos, index, this.fromData)
    this.$set(this.videos, this.fromIndex, data)
}
handleDragOver(e) {
    //默认无法把元素放置到其他元素当中,所以需要prevent
    e.preventDefault();
    e.dataTransfer.effectAllowed = "move";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值