卖坚果的怪叔叔 卖坚果的怪叔叔
  • 首页
  • 生活
  • 技术
  • 记录
  • 工具箱
  • 关于我
首页 › 技术 › Element Plus Upload 添加支持拖拽排序~

Element Plus Upload 添加支持拖拽排序~

坚果大叔
2025-07-30 20:55:55技术阅读 5,274

项目中使用element-plus ui框架作为基础项目组件,使用了其中的upload上传组件,在后续过程中提出需求需要支持拖拽排序,我...

但是原有的 upload 组件在其他方面都支持的很好,唯独没有没有支持拖拽这个功能,没有办法只能自己二次加工了。

组件主要分为三个部分:

  1. 上传: 使用原有的upload 组件
  2. 拖拽: 使用第三方插件 draggable 来实现图片列表的拖拽效果
  3. 预览: 因为没有使用原生组件,所以自带的预览也就没有了。

1. 使用draggable并设置相应的参数

关键配置:

  • item-key="uid": 指定每个拖拽项的唯一标识符
  • :animation="200": 设置拖拽动画时长为200ms
  • ghost-class="ghost": 拖拽时的幽灵元素样式类
  • @end="onDragEnd": 拖拽结束时的回调函数

2. 拖拽template的整体结构

3. 拖拽事件处理

因为是使用的成熟的第三方库,所以我们不需要关系拖拽的底层逻辑,只需要在应用层做相关的处理。

// 拖拽结束处理函数
const onDragEnd = () => {
  emit("update:modelValue", fileList.value);
};

1. 数据的实时更新

const fileList = ref(props.initFiles);

// 监听文件列表变化,同步到父组件
watch(fileList, (newVal) => {
  emit("update:modelValue", newVal);
});

2. 删除已上传的文件并且更新

const handleRemove = (
  uploadFile: UploadUserFile,
  uploadFiles?: UploadUserFile[]
) => {
  if (uploadFiles) {
    fileList.value = uploadFiles;
  } else {
    // 从拖拽列表中删除
    const index = fileList.value.findIndex(
      (file) => file.uid === uploadFile.uid
    );
    if (index > -1) {
      fileList.value.splice(index, 1);
      emit('update:modelValue', fileList.value);
    }
  }
};

3. 添加上传进度展示

// 上传进度回调
(percent) => {
  const fileIndex = fileList.value.findIndex(
    (f) => f.uid === file.uid
  );
  if (fileIndex !== -1) {
    fileList.value[fileIndex] = {
      ...fileList.value[fileIndex],
      percentage: percent,
    };
  }
}

// 添加幽灵效果
.ghost {
  opacity: 0.5;
  transform: scale(0.95);
}

既然原有组件不支持相关业务功能,我们不必执着于去改造他,换个思路,可以只保留他的核心上传的功能,其他像拖拽、预览、上传进度可以通过自定义的方式来实现。

毕竟没有哪个第三方组件能完美适配每一个项目,该造的轮子还是要造的。

https://cuixinxin.cn/2025/07/2025073012545791.mp4

赞赏 赞(0)
夏日的周末!
上一篇
Nuxt3中的水合是什么?以及使用中的一些总结!
下一篇
在小程序中查看

这是个😊,挣点服务器费用😜

评论已关闭

热门文章
是过年呀
重学JavaScript之基本概念(上) => 数据类型
小技巧!前端JS实现过滤指定内容~
腾讯视频VIP会员免费领取!3-31天。
重学JavaScript之变量、作用域和内存问题
微信小程序批量提交后台审核
专题标签
agent (1) CSS (15) dom (1) Es6入门系列 (14) Git (3) html (1) iview (1) JavaScript (9) js (4) Lif (1) Node (4) pyecharts (1) Python (10) ref (1) scriptable (1) Skill (1) vsCode (1) vue (4) wordpress (2) 三月 (1) 上海 (1) 假期 (1) 其他分享 (3) 前端两三问 (15) 古镇 (1) 外滩 (1) 对象 (1) 小程序 (5) 年度总结 (6) 年终总结 (1) 微信机器人 (4) 打字机 (1) 技术 (1) 日常问题 (8) 日常问题记录 (1) 春天 (2) 服务器 (2) 海族馆 (1) 生活 (8) 网上国网 (1) 记录 (3) 通勤 (1) 重学JavaScript (11) 面试题 (10) 🌸 (1)
什么是Agent?
2026-08-15 23:49:12
585 1 2
什么是 Skill?
2026-08-12 21:32:42
546 1 0
失业在家,我给小朋友做了一个练字小程序!
2026-08-07 16:21:52
985 10 1
上线8年,15万用户的小程序,一共赚了多少钱?
2026-05-30 18:01:24
4,915 4 0
  • 0
博主

一位佛系的前端开发者,略通摄影,乐于尝试新事物,热衷于美食。

友链
故事胶片
公众号
坚果大叔 执行上下文 卖坚果的怪叔叔 Dacking
Copyright © 2017-2026 卖坚果的怪叔叔

开往-友链接力

萌ICP备20230818号

苏ICP备18048410号-3
  • 首页
  • 生活
  • 技术
  • 记录
  • 工具箱
  • 关于我
# CSS # # JavaScript # # vue # # 微信 # # 生活 #
坚果大叔
346
文章
173
评论
432
喜欢