vue——js实现图片/文件的拖拽上传(复制粘贴就能用,还有优化空间)

首先先创建元素容器

<template>
  <div id="drop">
    <span v-show="isUpload" class="tip">拖拽图片/文件上传</span>
    <img src="" alt="" class="up-img" v-show="!isUpload" />
  </div>
</template>

写好元素样式

<style scoped lang="scss">
#drop {
  width: 200px;
  height: 200px;
  border: 3px dashed #ccc;
  margin: 100px auto;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  position: relative;
  &::before {
    content: '';
    position: absolute;
    left: 50%;
    top: 37%;
    width: 80px;
    margin-left: -40px;
    margin-top: -5px;
    border-top: 10px solid #ccc;
  }
  &::after {
    content: '';
    position: absolute;
    left: 50%;
    top: 37%;
    height: 80px;
    margin-left: -5px;
    margin-top: -40px;
    border-left: 10px solid #ccc;
  }
  .tip {
    position: absolute;
    bottom: 20px;
    z-index: 99;
  }
  .up-img {
    width: 200px;
  }
}
.hide {
  &::after {
    display: none;
  }
  &::before {
    display: none;
  }
}
</style>

效果如下 背景色是没有的 我自己加的
在这里插入图片描述
js代码

<script>
import { nextTick, onMounted, ref } from '@vue/runtime-core';
export default {
  setup() {
    let isUpload = ref(true);
     // 当拖拽元素第一次进入触发
    function dragEnter(e) {
      e.stopPropagation();
      e.preventDefault();
    }
//持续触发 当元素或者选择的文本被拖拽到一个有效的放置目标上时
//,触发 dragover 事件(每几百毫秒触发一次);这个事件在可被放置元素的节点上触发。
    function dragOver(e) {
      e.stopPropagation();
      e.preventDefault();
    }
// 当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时,drop 事件被抛出
    function drop(e) {
      e.preventDefault();
      // 当文件拖拽到dropBox区域时,可以在该事件取到file
      // 根据自己情况 在这里写网络请求
      var file = e.dataTransfer.files[0];
      var _type = file.type;
      console.log(_type);
      //file.type; 文件类型
      //file.name;文件名
      //file.size; 文件大小 btye
      var img = document.getElementsByTagName('img')[0];
      const tip = document.querySelector('.tip');
      const dropBox = document.querySelector('#drop');

      //如果是图片 粗略判断
      if (_type.indexOf('image') > -1) {
        var dataURL = URL.createObjectURL(file);
        img.src = dataURL;
        isUpload.value = false;
      } else {
        // 粗略处理
        tip.innerText = '文件:' + file.name;
        isUpload.value = true;
      }

      var formData = new FormData();
      formData.append('file', file);
      // 隐藏加号
      dropBox.classList.add('hide');
      console.log(file);
    }
    onMounted(() => {
      nextTick();
      // 此处定义一个drop容器(省略),并取到该元素;
      //参数三默认为false,表示在事件冒泡阶段调用;当该值为true时,表示在事件捕获阶段调用。
      const dropBox = document.querySelector('#drop');
      //拖动后首次在进入某个控件内发生
      dropBox.addEventListener('dragenter', dragEnter, false); 
      // 拖放对象悬浮拖放区域,在拖放区域移动会多次触发
      dropBox.addEventListener('dragover', dragOver, false); 
      // 源对象落在目标对象上
      dropBox.addEventListener('drop', drop, false); 
    });
    return {
      isUpload
    };
  },
  components: {}
};
</script>

效果: 如果是文件 这里是没有写样式 而是用文字代替
在这里插入图片描述

在这里插入图片描述
缺点: 上传第一张图片了,我在网页拖动这个图片,还会继续触发图片上传。
解决建议:根据自己需求加个锁 lock 什么时候开锁能请求,什么时候不能请求

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值