vue3项目,使用sortablejs对图片进行拖拽排序

安装:

插件地址:https://www.npmjs.com/package/sortablejs

复制代码
npm install sortablejs --save

pnpm add sortablejs --save

实现效果:

具体代码:

template部分的代码:

html 复制代码
<div class="imgList flex mt-5" ref="uploadImgItem">
          <div v-for="item in imgList" :key="item.fileOrder" class="imgItem">
            <!-- <img :src="item.url" alt="" v-if="item.fileType === 'image'" /> -->
            <el-image
              v-if="item.fileType === 'image'"
              style="width: 108px; height: 108px"
              :src="item.url"
              :zoom-rate="1.2"
              :max-scale="7"
              :min-scale="0.2"
              :preview-src-list="[item.url]"
              :initial-index="4"
              fit="cover"
            >
              <template #error>
                <div
                  style="width: 108px; height: 108px"
                  class="image-slot flex justify-center items-center"
                  @click="uploadErrorImgItem(item)"
                >
                  重新加载
                </div>
              </template>
            </el-image>
            <video
              :src="item.url"
              v-if="item.fileType === 'video'"
              ref="video"
              controls
              @pause="onVideoPause"
            ></video>
            <div
              @click="playVideo(item.url)"
              class="videoMask flex items-center justify-center"
              v-if="item.fileType === 'video' && !isPlay"
            >
              <img src="@/assets/icons/105.svg" alt="" />
            </div>
            <div class="deleteImg" @click="deleteFile(item.url)">
              <img src="@/assets/icons/106.svg" alt="" />
            </div>
          </div>
        </div>

script部分的代码:

javascript 复制代码
import { ref, reactive, toRefs, onMounted, watch, nextTick } from 'vue'
import Sortable from 'sortablejs'

const uploadImgItem = ref()
const imgList = ref<any>([])

//拖拽排序
const initDragSort = () => {
  nextTick(() => {
    // 选择包含所有可排序项目的容器
    const el = uploadImgItem.value

    // 确保 el 是一个有效的 DOM 元素
    if (el) {
      Sortable.create(el, {
        group: 'shared', // 设置同一组内的元素可以互相排序
        fallbackOnBody: true, // 如果需要的话,可以在 body 上进行拖拽
        swapThreshold: 0.65, // 控制元素交换的阈值
        onEnd: (/** 事件对象 */ evt: any) => {
          // 获取旧的索引和新索引
          const { oldIndex, newIndex } = evt

          // 交换位置
          const movedItem = imgList.value.splice(oldIndex, 1)[0]
          imgList.value.splice(newIndex, 0, movedItem)
          console.log(imgList.value)
        }
      })
    }
  })
}
相关推荐
禅思院6 分钟前
Vite vs Webpack 深度对比:从启动原理到生产构建,一篇就够了
前端·架构·前端框架
IT_陈寒7 分钟前
Vue的响应式真把我坑惨了,原来问题出在这
前端·人工智能·后端
朦胧之10 小时前
AI 编程-老项目改造篇
java·前端·后端
swipe13 小时前
从 0 到 1 实现大文件上传:分片、秒传、断点续传、暂停、重试与服务端合并
前端·javascript·面试
爱勇宝13 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
甲维斯13 小时前
用AI还原《坦克大战》并3D化升级!
前端·人工智能·游戏开发
IT_陈寒14 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
kyriewen15 小时前
AI 生成的代码能跑就行?这 5 个坑迟早炸
前端·javascript·ai编程
kisshyshy15 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
谷子在生长15 小时前
纯血鸿蒙自定义弹窗最佳实践:从「到处复制」到「一行调用」
前端·harmonyos