图片简单的拖拽排序(vue,接近原生)

本文介绍了一种自定义实现的图片拖拽排序方法,该方法适用于Vue项目中,并解决了在使用高德地图API时VueDraggable插件失效的问题。通过监听特定事件,实现了基本的拖拽功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需求做一个图片上传并且能够进行拖拽排序,项目中有引入了高德地图api

起初用的是vueDraggable,但是每次点击地图后整个页面的vueDraggable的拖拽功能失效了,无奈自己写了写,大体功能实现了但是没有插件的动画效果那么好

html部分

               <div
                class="mylist"
                :draggable="true"
                v-for="(item, index) in fileList"
                :key="item.name"
                @mouseleave="imgLeave(index)"
                @mouseenter="mouseenter(item,$event)"
                @dragstart="dragstart(item,$event)"
                @dragover="dragover(item,$event)"
                @drop="drop(item,$event)"
              >
                <div class=" myClose" >
                  <div class="mask" @click="imgClick(item,index)"> 
                    <a-icon type="close-circle" class="iconAppear" 
                      @click.stop="removeHandle(item)" 
                      style="position:absolute;cursor:pointer; top:5px;right:5px" /> 
                  </div>
                  <img style="width:100px;height:100px" 
                    :src="item.preview" 
                     @click="imgClick(item,index)" >
                </div>
              </div>

methods部分(js)

// 图片拖动排序相关
    mouseenter (itemValue, event) {
      // 兼容IE
      this.hoverAppear = true
      var ev = event || window.event
      ev.target.draggable = true
    },
    // 开始拖拽
    dragstart (itemValue, event) {
      // 兼容IE
      var ev = event || window.event
      // 阻止冒泡
      ev.stopPropagation()
      // 得到源目标数据
      this.sourceObj = itemValue
    },
    // 拖动元素经过的元素
    dragover (itemValue, event) {
      // 兼容 IE
      var ev = event || window.event
      // 阻止默认行为
      ev.preventDefault()
    },
    // 鼠标松开
    drop (itemValue, event) {
      // 兼容IE
      var ev = event || window.event
      // 阻止冒泡
      ev.stopPropagation()
      // 得到目标数据
      this.targetObj = itemValue
      this.fileList.map((item, index) => {
        if (item.uid === this.sourceObj.uid) {
          this.fileList.splice(index, 1)
        }
        if (item.uid === this.targetObj.uid) {
          this.fileList.splice(index, 1, this.sourceObj)
        }
      })
      this.fileList.map((item, index) => {
        if (item.uid === this.sourceObj.uid) {
          this.fileList.splice(index + 1, 0, this.targetObj)
        }
      })
    },

逻辑就是比如把最后一张图片拖到第一张先把第一张图片删除然后由最后一张代替,然后把原来的第一张添加到拖拽上来图片(原来的最后一张,现在的第一张)的后边,只是个简单的删除和添加

依照把最后一张拖到第一张的例子

fileList: 是图片数据,sourceObj:是你拖动的那张图片(举例来说就是最后一张),targetObj:是你拖动最终位置对应的图片数据(依照例子来说就是第一张)

通过事件传参把 对应的图片数据(item)传过来

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值