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


    本文使用的框架是vue3

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

    从浏览器外拖拽图片上传


    首先我们需要开辟一块需要拖拽上传图片的区域

    <template>
      <div class="targetArea" @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.width = "100%"
       img.style.height = "100%"
       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)
    */
    
  • 相关阅读:
    Java 时区转换(UTC+8 到 UTC 等等)
    spring 与 springmvc 的区别和定义
    字符串加密解密(Base64)
    上传视频本地预览问题
    vue 监听store中的数值
    判断对象是否为空
    正则 验证是否包含特殊字符
    js 过滤日期格式
    vue methods computed watch区别
    for + setTimeout
  • 原文地址:https://www.cnblogs.com/wazy999/p/14345720.html
Copyright © 2020-2023  润新知