坚果大叔 坚果大叔
  • 首页
  • 闲言碎语
  • 技术
  • 生活
  • 记录
  • 朋友
  • 热点新闻
  • 常用代码
  • 工具箱
  • 关于
首页 › 技术 › Element Plus Upload 添加支持拖拽排序~

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

坚果大叔
2025-07-30 20:55:55技术阅读 432

前提

项目中使用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,
    };
  }
}

CSS 拖拽状态样式

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

总结和效果

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

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

https://cuixinxin.cn/2025/07/2025073012545791.mp4
赞赏 赞(0)
夏日的周末!
上一篇
在小程序中查看
再想想
暂无评论
搜你想看的
聚合文章
deep 不生效!
微信小程序发布新版本,如何提示强制更新!
TrollStore 2 已发布,附超详细安装教程~
JQ获取图片的实际尺寸
闲言碎语
Memos
Nuxt3中piana持久化处理!
2025-06-22 18:45:45
614 0 2
npm install 出现 Error:EISDIR:illegal operation on a directory 的错误提示!
2025-03-31 19:02:11
1,106 0 1
iphone 利用 Scriptable 添加网上国网电费小组件
2025-01-06 20:40:20
7,835 3
在博客中加上memos记录展示。
2024-12-25 23:41:27
3,995 3
  • 0
  • 0
博主

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

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

开往-友链接力

萌ICP备20230818号

苏ICP备18048410号-3
  • 首页
  • 闲言碎语
  • 技术
  • 生活
  • 记录
  • 朋友
  • 热点新闻
  • 常用代码
  • 工具箱
  • 关于
# CSS # # JavaScript # # vue # # 微信 # # 生活 #
坚果大叔
326
文章
137
评论
397
喜欢