基于vue框架图片拖动排序怎么做,原理和方法是什么
Admin 2022-06-27 群英技术资讯 328 次浏览
本文实例为大家分享了vue实现图片拖动排序的具体代码,供大家参考,具体内容如下
原理:现有一个图片的列表,拖动其中一个图片(触发dragstart),当拖动的图片移动到其他图片的位置(触发dragover),则将拖动的图片从原位置移动到该位置(触发dragend)。
dragstart:当用户开始拖动一个元素或者一个选择文本的时候 dragstart 事件就会触发。
dragover:当元素或者选择的文本被拖拽到一个有效的放置目标上时,触发 dragover 事件(每几百毫秒触发一次)。
dragend:拖放事件在拖放操作结束时触发。(我们这里可以不用)
(1)图片列表HTML结构。给需要拖动的元素添加属性draggable。这里要注意:模板for循环的key值需要唯一,因为vue在渲染的时候会采用就地复用的方式,如果key值唯一,重新排序后渲染的列表节点不会复用,这样可以避免一些问题。(我们在插入的时候会根据序号向数组中插入某个数据)
<ul class="drag-container" @dragstart="onDragStart" @dragover="onDragOver" @dragend="onDragEnd" ref="imgList"> <li v-for="(item,idx) in list" :key='item.path' class="drag-list" draggable="true" > <img :src="item.path" alt="" /> </li> </ul>
(2)事件: dragstart、dragover绑定事件onDragStart、onDragOver
onDragStart:识别需要拖动的元素,保存到状态中,供拖动过程中dragover的绑定事件使用。
onDragStart(event){ console.log("start"); this.draging = event.target; },
onDragOver:拖动过程中处于有效目标上的时候触发事件,识别的是目标元素,而不是拖动的元素。首先识别目标元素是否是我们需要的目标元素,我们例子判断是否是li元素,并判断图片是否与拖动的相同,则进行插入拖动元素的操作。
识别拖动元素与目标元素的位置序号,将拖动元素插入到目标元素前,再将拖动元素原位置的数据删除,在vue中,则只需要进行数据操作即可。
onDragOver(event){ console.log('drag move') event.preventDefault(); let target = event.target; //因为dragover会发生在ul上,所以要判断是不是li if (target.nodeName === "LI" && target.childNodes[0].src !== this.draging.childNodes[0].src) { let idx_drag = this._index(this.draging) let idx_target = this._index(target) let _list = this.list let _drag = this.list[idx_drag] if(idx_drag>idx_target){ _list.splice(idx_target,0,_list[idx_drag]); _list.splice(idx_drag+1,1) }else{ _list.splice(idx_target+1,0,_list[idx_drag]); _list.splice(idx_drag,1) } console.log(_list[0].path) this.$emit("change", _list) } },
完整代码如下:
<template> <div class="image-list" v-if="list && list.length"> <ul class="drag-container" @dragstart="onDragStart" @dragover="onDragOver" @dragend="onDragEnd" ref="imgList"> <li v-for="(item,idx) in list" :key='item.path' class="drag-list" draggable="true" > <img :src="item.path" alt="" /> </li> </ul> </div> </template> <script> export default { name:"drag-image-list", props:{ list: Array, }, data(){ return { draging:null,//被拖拽的对象 } }, methods:{ onDragStart(event){ console.log("start"); this.draging = event.target; }, onDragOver(event){ console.log('drag move') event.preventDefault(); let target = event.target; //因为dragover会发生在ul上,所以要判断是不是li if (target.nodeName === "LI" && target.childNodes[0].src !== this.draging.childNodes[0].src) { let idx_drag = this._index(this.draging) let idx_target = this._index(target) let _list = this.list let _drag = this.list[idx_drag] if(idx_drag>idx_target){ _list.splice(idx_target,0,_list[idx_drag]); _list.splice(idx_drag+1,1) }else{ _list.splice(idx_target+1,0,_list[idx_drag]); _list.splice(idx_drag,1) } console.log(_list[0].path) } }, onDragEnd(event){ console.log('end event') }, _index(el){ var index = 0; if (!el || !el.parentNode) { return -1; } while (el && (el = el.previousElementSibling)) { index++; } return index; }, } } </script>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文主要给大家分享JS的URL对象的内容,一些朋友可能对JS的URL对象及使用不是很了解,因此这篇文章就给大家来详细的介绍一下JS的URL对象,感兴趣的朋友可以了解看看。
这篇文章主要介绍了Vue指令,Vue官网一共有提供了14个指令,下面我们就来详细讲解每一个指令的详细内容,需要的朋友可以参考一下
在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说concat和splice方法的使用不多说把代码编辑器打开
这篇文章就是主要介绍用原生JavaScript来实现一个简易的音乐播放器,其功能效果包括播放的控制,音乐进度条的控制,歌词的显示和高亮以及播放模式的设置。感谢的朋友就继续往下看吧
这篇文章主要介绍了React Hook用法详解(6个常见hook),本文通过实例代码给大家介绍了6个常见hook,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008