Vue:纯前端实现文件拖拽上传

先看一下拖拽相关的事件:dragoverdragenter dropdragleave

  • dragover事件:当被拖动的元素在一个可放置目标上方时,该事件会被触发。
    通常,我们会使用event.preventDefault()方法来取消浏览器默认的拖放行为,以便可以自定义拖拽行为。这个事件在拖拽过程中会持续触发,可以用于实现一些特殊的样式效果,如显示拖拽目标的悬浮效果。

  • drop事件:当拖动的元素被释放时,该事件会被触发。
    drop事件中,可以获取拖放的数据,并进行相应的处理。通过event.dataTransfer对象可以获得拖放相关的数据,包括被拖动的文件列表或其他自定义数据。我们可以在drop事件的处理函数中执行文件上传、移动元素等操作。
    注意,drop和dragover必须一起使用,不然drop无法被触发

  • dragenter事件:当被拖动的元素进入一个可放置目标时,该事件会被触发。
    这个事件通常与dragover事件一起使用,用于改变可放置目标的样式或状态,以向用户展示目标元素的拖放状态。

  • dragleave事件:当被拖动的元素离开一个可放置目标时,该事件会被触发。
    dragenter事件相似,这个事件也常常和dragover事件一起使用,用于恢复目标元素的样式或状态,以向用户展示拖放状态的变化。

具体实现:

<template><divclass="content":class="{ 'drag-enter': dragEnter }"@dragover="handleDragOver"@dragenter="handleDragEnter"@dragleave="handleDragLeave"@drop="handleFileDrop"><div v-if="!fileContent">将文件拖拽到这里显示</div><p v-else>{{ fileContent }}</p></div>
</template><script lang="ts" setup>
import { ref } from "vue";const dragEnter = ref(false);
const fileContent = ref("");// 被拖动的元素进入可放置目标时
const handleDragEnter = (e: DragEvent) => {dragEnter.value = true;e.preventDefault();
};// 被拖动的元素在可放置目标上方时
const handleDragOver = (e: DragEvent) => {dragEnter.value = true;e.preventDefault();
};// 被拖动的元素离开可放置目标时
const handleDragLeave = (e: DragEvent) => {dragEnter.value = false;e.preventDefault();
};// 释放被拖动的元素
const handleFileDrop = (e: DragEvent) => {dragEnter.value = false;e.preventDefault();// 获取上传的文件,files是一个数组,可能同时存在一次拖拽多个文件的情况const files = e.dataTransfer?.files as FileList;// 此处只处理第一个上传的文件,file包含了上传的文件大小、类型、名称等信息const file = files[0];//  限制文件大小if (file.size / 1024 / 1024 > 10) {console.log("文件不能大于10M。");return;}// 限制文件类型if (!["text/plain", "application/json"].includes(file.type)) {console.log("仅支持txt、 json文件。");return;}// 定义一个文件读取器,读取文件内容let reader = new FileReader();reader.readAsText(file, "UTF-8");reader.onload = (e: ProgressEvent<FileReader>) => {fileContent.value = e.target?.result;};
};
</script><style scoped>
.content {width: 400px;height: 400px;overflow: auto;border: 1px solid #dcdfe6;
}
.empty-tips {margin: 0 auto;
}
.drag-enter {border: 1px solid #45a3ff;
}
</style>

页面展示:
在这里插入图片描述
实现其实很简单,主要就是掌握拖拽相关的几个事件。

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

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

相关文章

017集——圆弧(ARC)转多段线(lwpolyline)——cad vba 中按一定精度拟合加点实现

在国土资源管理项目中&#xff0c;我们经常会遇到CAD转gis数据实现入库&#xff0c;而cad中的arc圆弧转为gis数据只能转出弧的顶点坐标&#xff0c;导致图形变形失真。若一个一个对弧进行手工增加点转为多段线&#xff0c;耗时耗力&#xff0c;效率极其低下。这里给出解决方案&…

新书速览|FFmpeg开发实战:从零基础到短视频上线

资深音视频开发专家、畅销书作者重磅新作&#xff0c;从基础知识到高级应用&#xff0c;从桌面开发到移动开发&#xff0c;9大实际音视频项目完整再现 本书内容 《FFmpeg开发实战&#xff1a;从零基础到短视频上线》是一本FFmpeg开发的实战教程&#xff0c;由浅入深&#xff0…

十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)

目录 一、冒泡排序&#xff1a; 二、插入排序&#xff1a; 三、选择排序&#xff1a; 四、希尔排序&#xff1a; 五、堆排序&#xff1a; 六、快速排序&#xff1a; 6.1挖坑法&#xff1a; 6.2左右指针法 6.3前后指针法&#xff1a; 七、归并排序&#xff1a; 八、桶…

F - Earn to Advance

解题思路 由于对于一点不知道后面得花费&#xff0c;所以无法决策当前是否要停下赚钱或要停下多久考虑一点&#xff0c;可以由其左上方的所有点到达所以从往前推&#xff0c;得出到的总花费然后考虑从之后不赚钱直接到最终所用次数和剩余钱若存在&#xff0c;在后面点赚钱更优…

【Web】浅聊Java反序列化之AspectJWeaver——任意文件写入

目录 简介 原理分析 EXP CC5改链 CC6改链 简介 pom依赖&#xff1a; <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version> </dependency> AspectJWeaver 是 …

【Python】Python注册微服务到nacos

Python注册微服务到Nacos 1.Nacos部署 github 的nacos项目的发布页&#xff08;Releases alibaba/nacos GitHub &#xff09;&#xff0c;选择所要下载的nacos版本&#xff0c;在nacos下方的assets中选择安装包进行下载。 解压nacos安装包到指定目录。 tar -zxvf nacos-ser…

不允许你不知道Python作用域

在Python中&#xff0c;变量的作用域限制非常重要。根据作用域分类&#xff0c;有局部、全局、函数和内建作用域。无作用域限制的变量可以在分支语句和循环中定义&#xff0c;并在外部直接访问。不同的作用域决定了变量的可访问范围&#xff0c;访问权限取决于变量的位置。 1.…

前端学习之列表标签

目录 有序列表 结果 无序标签 结果 数据标签 结果 有序列表 &#xff08;注&#xff1a;注释是解释&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </…

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv&#xff0c;双击LiteEnv &#xff0c;在右侧选择对应系统的env文件&#xff0c;我的是win64系统&#xff0c;所以文件名为win64.env 再双击 win64.env &#xff0c;关闭当前窗口&…

【嵌入式实践】【芝麻】【硬件篇-1】从0到1给电动车添加指纹锁:电源电路调研及原理讲解

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

美团发布VisionLLaMA,为视觉生成和理解提供新基线

在人工智能领域&#xff0c;统一的模型架构对于简化模型设计、提高模型效率以及促进跨领域应用具有重要意义。近年来&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在处理文本输入方面取得了显著的进展&#xff0c;其中基于变换器&#xff08;Tra…

python+realsense

单目相机(RGB影像):分辨率&#xff1a;320180,320240,424240,640360,640480,848480,960540,1280720,19201080&#xff1b;帧率&#xff1a;6,15,30,60 按照博文Python实战之Realsense_realsense python-CSDN博客的代码显示如下&#xff08;我更改了分辨率和帧率&#xff0c;大…