vue3中使用原始标签制作一个拖拽和点击上传组件上传成功后展示

 在Vue3中,可以使用<input type="file">标签来实现上传文件的功能,同时可以通过<div>标签来实现拖拽上传的功能。

首先,在template中定义一个包含<input>和<div>标签的组件:

<template><div class="dropzone" @dragover.prevent @drop="handleDrop"><input type="file" @change="handleFileUpload"></div><div v-if="uploadedFile"><p>上传成功!文件名:{{ uploadedFile.name }}</p><img :src="uploadedFileUrl" /></div>
</template>

然后,在script中定义组件的逻辑:

<script>
export default {data() {return {uploadedFile: null,uploadedFileUrl: null,};},methods: {handleFileUpload(event) {const file = event.target.files[0];this.uploadFile(file);},handleDrop(event) {event.preventDefault();const file = event.dataTransfer.files[0];this.uploadFile(file);},async uploadFile(file) {const formData = new FormData();formData.append('file', file);// 发送上传请求,成功后将uploadedFile和uploadedFileUrl赋值},},
};
</script>

style中添加一些样式:

<style>
.dropzone {border: 2px dashed gray;padding: 20px;text-align: center;
}
</style>

这样就可以通过拖拽或点击上传文件,并在上传成功后展示上传的图片了。


在Vue3中,我们可以使用原生标签制作一个拖拽和点击上传组件,以下是实现步骤:

  1. 在组件中定义一个data属性,用于存储上传文件的信息:
<template><div><input type="file" ref="fileInput" @change="handleFileChange"><divclass="drop-zone"@dragover.prevent@drop.prevent="handleDrop"><p>拖拽文件到此处或点击上传</p></div><div v-if="fileUrl"><img :src="fileUrl" alt=""></div></div>
</template><script>
export default {data() {return {file: null,fileUrl: null}},methods: {handleFileChange(event) {this.file = event.target.files[0]this.uploadFile()},handleDrop(event) {this.file = event.dataTransfer.files[0]this.uploadFile()},async uploadFile() {// 文件上传逻辑const response = await this.$axios.post('/upload', this.file)this.fileUrl = response.data.url}}
}
</script>

定义一个input标签,用于点击上传文件:

<input type="file" ref="fileInput" @change="handleFileChange">

定义一个div标签作为拖拽上传区域:

<divclass="drop-zone"@dragover.prevent@drop.prevent="handleDrop"><p>拖拽文件到此处或点击上传</p>
</div>

监听input和拖拽事件,获取文件信息并调用uploadFile方法上传文件:

methods: {handleFileChange(event) {this.file = event.target.files[0]this.uploadFile()},handleDrop(event) {this.file = event.dataTransfer.files[0]this.uploadFile()},async uploadFile() {// 文件上传逻辑const response = await this.$axios.post('/upload', this.file)this.fileUrl = response.data.url}
}

在上传成功后展示文件:

<div v-if="fileUrl"><img :src="fileUrl" alt="">
</div>

完整代码如下:

<template><div><input type="file" ref="fileInput" @change="handleFileChange"><divclass="drop-zone"@dragover.prevent@drop.prevent="handleDrop"><p>拖拽文件到此处或点击上传</p></div><div v-if="fileUrl"><img :src="fileUrl" alt=""></div></div>
</template><script>
export default {data() {return {file: null,fileUrl: null}},methods: {handleFileChange(event) {this.file = event.target.files[0]this.uploadFile()},handleDrop(event) {this.file = event.dataTransfer.files[0]this.uploadFile()},async uploadFile() {// 文件上传逻辑const response = await this.$axios.post('/upload', this.file)this.fileUrl = response.data.url}}
}
</script><style>
.drop-zone {border: 2px dashed gray;height: 200px;display: flex;align-items: center;justify-content: center;
}
</style>

点击或拖拽上传图片 

<template><div><input type="file" ref="fileInput" style="display: none" @change="handleFileUpload"><div class="image-container"><img :src="imageUrl" @click="handleImageClick" @dragover="handleDragOver" @drop="handleDrop"><p v-if="!imageUrl">点击或拖拽上传图片</p></div></div>
</template><script>
import { ref } from 'vue';export default {data() {return {imageUrl: null,};},methods: {handleImageClick() {this.$refs.fileInput.click();},handleDragOver(event) {event.preventDefault();},handleDrop(event) {event.preventDefault();const file = event.dataTransfer.files[0];this.uploadImage(file);},handleFileUpload(event) {const file = event.target.files[0];this.uploadImage(file);},async uploadImage(file) {// 在这里执行上传图片的逻辑// 可以使用axios或其他库发送请求到服务器// 处理上传成功后的结果,比如更新图片URLthis.imageUrl = await this.uploadToServer(file);},async uploadToServer(file) {// 上传文件到服务器的逻辑// 返回上传成功后的图片URL},},
};
</script>

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

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

相关文章

【C++】模板学习(二)

模板学习 非类型模板参数模板特化函数模板特化类模板特化全特化偏特化 模板分离编译模板总结 非类型模板参数 模板参数除了类型形参&#xff0c;还可以是非类型的形参。 非类型形参要求用一个常量作为类(函数)模板的一个参数。这个参数必须是整形家族的。浮点数&#xff0c;字…

pytorch学习——正则化技术——丢弃法(dropout)

一、概念介绍 在多层感知机&#xff08;MLP&#xff09;中&#xff0c;丢弃法&#xff08;Dropout&#xff09;是一种常用的正则化技术&#xff0c;旨在防止过拟合。&#xff08;效果一般比前面的权重衰退好&#xff09; 在丢弃法中&#xff0c;随机选择一部分神经元并将其输出…

Vue 常用指令 v-model 双向数据绑定

之前的指令&#xff0c;无论使用哪一种&#xff0c;都是在代码当中定义的内容。在web开发当中经常要去获取用户的输入&#xff0c;v-model可以十分方便的将表单的值和实例当中的数据关联起来。 这样就可以十分便捷的获取和设置表单元素的值了。&#xff08;注意是表单元素&…

SpringBoot第29讲:SpringBoot集成MySQL - MyBatis-Plus代码自动生成

SpringBoot第29讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus代码自动生成 本文是SpringBoot第29讲&#xff0c;主要介绍 MyBatis-Plus代码自动生成&#xff0c;以及产生此类代码生成工具的背景和此类工具的基本实现原理。 文章目录 SpringBoot第29讲&#xff1a;SpringBo…

【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…

PHP高级检索功能的实现以及动态拼接sql

我们学习了解了这么多关于PHP的知识&#xff0c;不知道你们对PHP高级检索功能的实现以及动态拼接sql是否已经完全掌握了呢&#xff0c;如果没有&#xff0c;那就跟随本篇文章一起继续学习吧! PHP高级检索功能的实现以及动态拼接sql。完成的功能有&#xff1a;可以单独根据一个…

华为云hcip核心知识笔记(数据库服务规划)

华为云hcip核心知识笔记&#xff08;数据库服务规划&#xff09; 1.云数据接库优势 1.1云数据库优点有&#xff1a; 易用性强&#xff1a;能欧快速部署和运行 高扩展&#xff1a;开放式架构和云计算存储分离 低成本&#xff1a;按需使用&#xff0c;成本更加低廉 2.云数据库r…

微软开测“Moment4”启动包:Win11 23H2要来了

近日&#xff0c; 有用户在Win11最新的7月累积更新中发现&#xff0c;更新文件中已经开始出现了对“Moment4”的引用。 具体来说&#xff0c;在7月累积更新中&#xff0c;微软加入了“Microsoft-Windows-UpdateTargeting-ClientOS-SV2Moment4-EKB”“Microsoft-Windows-23H2Ena…

2023年【零声教育】13代C/C++Linux服务器开发高级架构师课程体系分析

对于零声教育的C/CLinux服务器高级架构师的课程到2022目前已经迭代到13代了&#xff0c;像之前小编也总结过&#xff0c;但是课程每期都有做一定的更新&#xff0c;也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求&#xff0c;之前课程里面也包含了一些小的分支&#…

音频客观感知MOS对比,对ViSQOL、PESQ、MosNet(神经网络MOS分)和polqa一致性对比和可信度雁阵

原创&#xff1a;转载需附链接&#xff1a; 音频客观感知MOS对比&#xff0c;对ViSQOL、PESQ、MosNet&#xff08;神经网络MOS分&#xff09;和polqa一致性对比和可信度雁阵_machine-lv的博客-CSDN博客谢谢&#xff01; 本文章以标准polqa的mos分为可信前提&#xff0c;验证vis…

MPAndroidChart学习及问题处理

1.添加依赖 项目目录->app->build.gradle dependencies {implementation com.github.PhilJay:MPAndroidChart:v3.0.3 }项目目录->app->setting.gradle dependencyResolutionManagement {repositories {maven { url https://jitpack.io }} }高版本的gradle添加依…

2023年第四届“华数杯”数学建模思路 - 案例:感知机原理剖析及实现

# 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其原理可以看下图&#xff1a; 比如说我们有一个坐标轴&#xff08;图中的…

关于视频汇聚融合EasyCVR平台多视频播放协议的概述

视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台既具备传统安防视频监控的能力与服务&#xff0c;也支持AI智能检测技术的接入&#xff0c;可应用在多行业领域的智能化监管场…

直线模组如何进行精度校准?

直线模组是一种高精度的传动元件&#xff0c;而精度是直线模组的重要指标&#xff0c;在直线模组的使用中&#xff0c;我们应该尽可能的避免直线模组的精度受损&#xff0c;这样才能够有真正的发挥出直线模组的稳定性。 直线模组的精度一般是指重复定位精度和导向精度&#xff…

PyTorch(安装及卸载)

目录 1. 安装 2. 卸载 参考文献 为什么用PyTorch&#xff1a;简单来说&#xff0c;19年之前tensorflow是大哥&#xff0c;19年tensorflow和PyTorch双龙并行&#xff0c;20年之后PyTorch一往无前。宗旨&#xff0c;哪个用的人多用哪个。 1. 安装 1. 先打开Anaconda Prompt&…

uniapp自定义消息语音

需求是后端推送的消息APP要响自定义语音&#xff0c;利用官方插件&#xff0c;总结下整体流程 uniapp后台配置 因为2.0只支持uniapp自己的后台发送消息&#xff0c;所以要自己的后台发送消息只能用1.0 插件地址和代码 插件地址: link let isIos (plus.os.name "iOS&qu…

C++内存管理

目录 一.C中内存区域划分 一.C中内存区域划分 1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2.内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信。 …

手撕SpringBoot的自定义启动器

一. 前言 哈喽&#xff0c;大家好&#xff0c;最近金九银十&#xff0c;又有不少小伙伴私信辉哥&#xff0c;说自己在面试时被问到SpringBoot如何自定义启动器&#xff0c;结果自己不知道该怎么回答。那么今天就手把手地带着大家&#xff0c;去看看在SpringBoot中到底该怎么实…

亚马逊买家账号ip关联怎么处理

对于亚马逊买家账号&#xff0c;同样需要注意IP关联问题。在亚马逊的眼中&#xff0c;如果多个买家账号共享相同的IP地址&#xff0c;可能会被视为潜在的操纵、违规或滥用行为。这种情况可能导致账号受到限制或处罚。 处理亚马逊买家账号IP关联问题&#xff0c;建议采取以下步骤…