vue3+ts实现图片上传并可拖拽

实现多张图片拖拽上传,并且可以拖拽调整图片顺序的示例:

<template>
  <div>
    <el-upload
      ref="uploadRef"
      class="upload-demo"
      drag
      action="https://your-upload-url.com"
      :on-success="handleSuccess"
      :on-remove="handleRemove"
      multiple
    >
      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
      <div class="el-upload__text">
        拖拽文件到此处或 <em>点击上传</em>
      </div>
    </el-upload>

    <div class="image-list" ref="imageListRef">
      <div
        v-for="(image, index) in images"
        :key="image.id"
        class="image-item"
        draggable="true"
        @dragstart="dragStart($event, index)"
        @dragover.prevent
        @dragenter.prevent
        @drop="drop($event, index)"
      >
        <el-image :src="image.url" fit="cover" />
      </div>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { ElUpload, ElImage } from 'element-plus'
import { UploadFilled } from '@element-plus/icons-vue'

interface ImageItem {
  id: number
  url: string
}

const uploadRef = ref<InstanceType<typeof ElUpload>>()
const imageListRef = ref<HTMLElement>()
const images = ref<ImageItem[]>([])
let dragIndex = -1

const handleSuccess = (response: any, file: any) => {
  images.value.push({
    id: Date.now(),
    url: URL.createObjectURL(file.raw)
  })
}

const handleRemove = (file: any) => {
  const index = images.value.findIndex(img => img.url === file.url)
  if (index !== -1) {
    images.value.splice(index, 1)
  }
}

const dragStart = (event: DragEvent, index: number) => {
  dragIndex = index
  if (event.dataTransfer) {
    event.dataTransfer.effectAllowed = 'move'
  }
}

const drop = (event: DragEvent, index: number) => {
  if (dragIndex !== index) {
    const draggedImage = images.value[dragIndex]
    images.value.splice(dragIndex, 1)
    images.value.splice(index, 0, draggedImage)
  }
}

onMounted(() => {
  if (imageListRef.value) {
    imageListRef.value.addEventListener('dragover', (e: Event) => {
      e.preventDefault()
    })
  }
})
</script>

<style scoped>
.image-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 20px;
}

.image-item {
  width: 100px;
  height: 100px;
  cursor: move;
}

.el-image {
  width: 100%;
  height: 100%;
}
</style>

这个示例实现了以下功能:

  1. 使用 Element Plus 的 el-upload 组件实现拖拽上传功能。
  2. 上传成功后,将图片添加到 images 数组中。
  3. 可以删除已上传的图片。
  4. 使用 HTML5 拖放 API 实现图片位置的拖拽调整。

注意事项:

  1. 请将 action 属性替换为你的实际上传 URL。
  2. 这个示例使用了 URL.createObjectURL() 来创建图片预览 URL。在实际应用中,你可能需要使用服务器返回的 URL。

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温暖前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值