前端如何实现拖拽效果(一)

摘要:
div@drop=“dropImg”@dragover=“dragover”ref=“dropTarget”>target){constheader=newFileReader();{consttagChild=target.getElementsByTagName(“img”)[0]if(tagChild){target.removeChild(tagChild);

本文使用的框架是vue3

在日常项目的开发中,会遇到从浏览器外拖拽图片上传或者拖拽图片交换位置的需求

从浏览器外拖拽图片上传

前端如何实现拖拽效果(一)第1张
首先我们需要开辟一块需要拖拽上传图片的区域

<template>
  <div   @drop="dropImg" @dragover="dragover" ref="dropTarget">
    <div v-if="hasImg">拖拽图片上传</div>
  </div>
</template>

编写拖拽的方法

dragover(e){
 e.preventDefault();
},

dropImg(e){
  e.preventDefault();
  let file = e.dataTransfer.files[0];
  let target = this.$refs.dropTarget
  this.loadImg(file,target)
},

loadImg(file,target){
  const reader = new FileReader();
  const that = this
  reader.onload = (e) => {
   const tagChild = target.getElementsByTagName("img")[0]
   if(tagChild){
     target.removeChild(tagChild);
   }
   const img = document.createElement("img");
   img.style. 
   img.style. 
   img.src = e.target.result;
   target.append(img)
   that.hasImg = false
 }
    reader.readAsDataURL(file)
 }

注:e.preventDefault()是为了阻止浏览器的默认行为防止跳转页面等行为

这里有三个事件/方法

dragover

当图片文件拖到对应框内时,鼠标停留执行的事件。

drop

拖拽到对应框内鼠标松开后会执行的事件
通过e.dataTransfer.files[0]获取图片的信息,图片的格式继承自blob格式,所以可以通过new FileReader()解析图片最终创建img标签传入到页面上

loadImg

渲染图片方法
通过new FileReader()读取图片信息,readAsDataURL()方法可以将图片信息读取成一个url以便于传入img标签的src中。
如果需要上传到后端的话可以用如下方法:

const file = e.dataTransfer.files[0];
const formData = new FormData();
formData.append("file", file);
/* 
最后将整个formData作为参数上传上去即可。
例如:this.$axios.post("/upload", formData)
*/

免责声明:文章转载自《前端如何实现拖拽效果(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安装SQl Server 报错 "需要 Microsoft.NET Framework 3.5 ServicePack 1" 解决方法单片机模拟 1/2 Bias、1/4 Duty的 LCD 驱动使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

拉普拉斯平滑(Laplace Smoothing)

拉普拉斯平滑(Laplace Smoothing)又称 加1平滑,常用平滑方法。解决零概率问题。 背景:为什么要做平滑处理? 零概率问题:在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。 在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。 这是不合理的...

类型信息

一、Class对象 在Object类中定义了以下的方法,此方法将被所有子类继承: public final Class getClass() @Test public void test3() { Person person = new Person(); Class clazz = person.getC...

ios图片添加文字或者水印

  在项目中,我们会对图片做一些处理,但是我们要记住,一般在客户端做图片处理的数量不宜太多,因为受设备性能的限制,如果批量的处理图片,将会带来交互体验性上的一些问题。首先让我们来看看在图片上添加文字的方法、    -(UIImage *)addText:(UIImage *)img text:(NSString *)text1{ //上下文的大小 int...

公用技术——数据格式——JSON——Jackson类库——序列化——属性,键映射关系

  通常情况下,对象的属性与JSON键的关系是一对一,键的顺序是根据属性的顺序,键的名称是与属性的名称保持一致的。 Jackson有很多注解可以修改以上三种关系。首先从属性名称与键名称开始。 1、名称 1.1     @JsonProperty 在属性上添加@JsonProperty注解,给value赋值可以修改对应的键名称,例如User对象存在name属...

SSH框架之-hibernate 三种状态的转换

一、遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更改后的数据却神奇的保存到数据库里面去了。 最后简单粗暴的解决办法是把这份从数据里面查出来的List 复制了一份,然后再操作,再返回。数据就正常了,数据库也没...

教会你Linux Shell自动交互的三种方法

你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。 一、背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完...