已实现:前端js实现拖拽调整图片顺序功能,js简单实现拖拽api,使用element-ui的el-upload组件实现

同事给到我一个新的需求,其中包括一个上传的图片列表的顺序调整功能,还需要通过拖拽图片实现调序,简单实现这个功能,并做一个记录
环境:Vue3 + element-ui,在组件el-upload中的多文件上传列表中实现,先上运行图,动图演示功能符合你的需求,你就接着往下看,不符合也节约你的时间

在这里插入图片描述

直接上源码吧,先是上布局部分
<el-uploadv-model:file-list="fileList":accept="fileType.join(',')":action="updateUrl":before-upload="beforeUpload":class="['upload', drag ? 'no-border' : '']":drag="drag":headers="uploadHeaders":limit="limit":multiple="true":on-error="uploadError":on-exceed="handleExceed":on-success="uploadSuccess"list-type="picture-card"><div class="upload-empty"><slot name="empty"><Icon icon="ep:plus"/><!-- <span>请上传图片</span> --></slot></div><template #file="{ file }"><!--这里是拖拽的关键代码,使用一个div包裹住需要拖拽的控件,在此div上进行设置拖拽事件--><div draggable="true" @dragstart="handleDragStart($event,file)" @drop="handleDrop($event,file)" @dragover.prevent><img :src="file.url" class="upload-image"/><div class="upload-handle" @click.stop><div class="handle-icon" @click="handlePictureCardPreview(file)"><Icon icon="ep:zoom-in"/><span>查看</span></div><div class="handle-icon" @click="handleRemove(file)"><Icon icon="ep:delete"/><span>删除</span></div></div></div></template></el-upload>

说明一下这段代码:这段代码的关键部分就是template中的div了,div上面也有注释,这里详细说一下,首先我们需要向div添加两个事件,

@dragstart="handleDragStart($event,file)" 
@drop="handleDrop($event,file)" 

这两个事件第一个是点击按下的时候执行,第二个事件是鼠标松开时执行。传入第一个必传参数$event,再传入第二个自选参数file,我这里因为是用的上传组件,所以只能拿到file,拿不到file在fileList中的index,也可能是我没见识,欢迎给我指教,拿到file以后也可以获取到在fileList中的index,倒是没啥影响,这里有一点很关键,就是这两个事件传入的file不是同一个,start传入的是点击时被拖拽的file,drop中的file是鼠标指针释放时所指的file,这也是el-upload组件提供给我们的一个比较方便的处理方案,否则我可能还需要更复杂的方法来获取释放位置。

如果大家使用v-for实现的组件列表拖拽功能,就可以直接传入index了,稍后我会把这两个方法的具体实现放出来,
我们先看在div中很重要的一项设置:

@dragover.prevent

缺了这一项配置,那么可能会导致鼠标释放时不触发,这项配置是为了阻止浏览器默认的拖拽行为,有助于确保 @drop 事件被正确触发。

然后下面就到了关键的两个事件方法的实现了:
// 拖拽排序相关的函数
const handleDragStart = (event, file) => {// 输出被拖动的文件对象console.log(file);// 在当前fileList中查找被拖动文件的索引const index = fileList.value.findIndex(element => element === file);console.log(index);// 将被拖动文件的索引设置到dataTransfer对象中,以便在拖放时使用event.dataTransfer.setData('index', index.toString());
};const handleDrop = (event, file) => {// 在当前fileList中查找被释放文件的索引const index = fileList.value.findIndex(element => element === file);console.log(index);// 阻止默认的拖放行为(例如打开链接等)event.preventDefault();// 从dataTransfer对象中获取被拖动项的索引const draggedIndex = Number(event.dataTransfer.getData('index'));// 从原始fileList中获取被拖动的项const draggedItem = fileList.value[draggedIndex];// 创建当前fileList的副本以进行修改const updatedList = [...fileList.value];// 从原始位置删除被拖动的项updatedList.splice(draggedIndex, 1);// 将被拖动的项插入到列表的新位置updatedList.splice(index, 0, draggedItem);// 使用修改后的列表更新fileListfileList.value = updatedList;// 发送一个事件通知父组件fileList已更新emit('update:modelValue', updatedList);
};

这两个方法每一句的注释都很清晰了,所以不需要再多做说明了。最后附上运行效果吧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285097.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Js实战,计算器功能开发

场景&#xff1a; 通过动态设置按钮组件button实现计算器的键盘&#xff0c;通过文本text显示计算的表达书&#xff0c;可以计算&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;可以一个一个移除&#xff0c;可以重置 等。 下面我们开始今天的文章&#xff0c;还是老规…

tensorflow入门

一、怎样入手TensorFlow TensorFlow是一个用于机器学习和深度学习的开源框架&#xff0c;它提供了一种灵活的方式来构建和训练神经网络模型。以下是一些TensorFlow框架入门的建议&#xff1a; 学习Python语言&#xff1a;TensorFlow主要使用Python语言进行开发&#xff0c;因此…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

Gitee基础知识

目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法&#xff1a; 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…

Android vs. iOS:移动操作系统的对决

导言 Android和iOS作为两大主流移动操作系统&#xff0c;影响着数十亿用户的数字生活。Android和iOS&#xff0c;作为移动操作系统的巅峰代表&#xff0c;它们的竞争塑造了全球数十亿用户的数字化生活。本文将深入探讨这两个系统的起源、特点以及它们在用户体验、开发者生态和市…

用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式

1、模式标准 模式名称&#xff1a;解析器模式 模式分类&#xff1a;行为型 模式意图&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 结构图&#xff1a; 适用于&#xff1…

02-knative-serving部署

示例环境 Kubernetes: v1.27.1Knative: v1.12networking layer: istio 可用的部署方式 基于YAML配置文档直接部署 Serving和Eventing需要分别进行部署 借助Knative Operator进行部署 首先部署Knative Operator通过Operator的KnativeServing部署Serving通过Operator的KnativeEv…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5 参考文章&#xff1a; 《记录-下fedora 33安装deepin qq和微信 &#xff0c;不需要安装deepinwine》 https://tieba.baidu.com/p/7279470269 《opensuse使用virtualbox安装win10》 https://blog.c…

Linux---编辑器 vim

1. vim 的介绍 vim 是一款功能强大的文本编辑器&#xff0c;也是早年 Vi 编辑器的加强版&#xff0c;它的最大特色就是使用命令进行编辑&#xff0c;完全脱离了鼠标的操作。 2. vim 的工作模式 命令模式编辑模式末行模式 说明: vim 打开文件进入的是命令模式 工作模式效果…

Axure情形动作篇(ERP登录效验)

目录 一、ERP系统用户登录效验 1.1 完成步骤 1.2 最终效果 二、省市区联动 三、ERP菜单栏页面跳转 四、下拉加载效果实现 4.1 加载动画实现步骤 4.2 下划界面加载实现 4.3 最终效果 一、ERP系统用户登录效验 1.1 完成步骤 首先搭建ERP系统的登录界面&#xff08;输入…

Kafka 数据乱序

每个broker队列最多能缓存5个没有应答的请求&#xff1a; 发送数据1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。发送到3的时候没有应答成功&#xff0c;要重发&#xff0c;结果4先过来了&#xff0c;就导致乱序。 解决&#xff1a;开启幂等性 max.in.flight.req…