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

news2024/9/21 14:51:02

 在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">
    <div
      class="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标签作为拖拽上传区域:

<div
  class="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">
    <div
      class="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或其他库发送请求到服务器
      // 处理上传成功后的结果,比如更新图片URL
      this.imageUrl = await this.uploadToServer(file);
    },
    async uploadToServer(file) {
      // 上传文件到服务器的逻辑
      // 返回上传成功后的图片URL
    },
  },
};
</script>

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

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

相关文章

使用Vscode编辑keil工程

一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置&#xff1a; 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了&#xff0c;调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…

【Unity实用插件篇】| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【Unity 实用插件篇】| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片资源…

如何创建百度百科词条?教你如何在百度百科上创建个人专业词条

百度百科是一个拥有海量内容的知识库&#xff0c;每天有数百万人访问该网站以获取有用的信息和知识。如果您是一家企业、一位专业人士或学者&#xff0c;那么在百度百科上创建一个词条是一个很好的品牌推广或个人形象塑造的机会。在本文中&#xff0c;一秒推小编将讲述如何创建…

安防视频综合管理合平台EasyCVR可支持的视频播放协议有哪些?

EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。 视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的…

JVM基础篇-方法区与运行时常量池

JVM基础篇-方法区与运行时常量池 方法区 Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。方法区类似于传统语言的编译代码的存储区或者类似于操作系统进程中的“文本”段。它存储每个类的结构&#xff0c;例如运行时常量池、字段和方法数据&#xff0c;以及方法和…

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换

文章目录 1. Opencv2. Matplotlib3. PIL4. 三者的区别和相互转换5. Torchvision 中的相关转换库5.1 ToPILImage([mode])5.2 ToTensor5.3 PILToTensor 1. Opencv opencv的基本图像类型可以和numpy数组相互转化&#xff0c;因此可以直接调用torch.from_numpy(img) 将图像转换成t…

Sql server 2005 卸载之后重新安装

Sql server 2005 卸载之后重新安装 Sql sercer 2005在重新安装之前先要进行卸载操作&#xff0c;由于Sql sercer 2005组件都是分散的&#xff0c;所以卸载时要找到对应的位置一个一个卸载&#xff0c;不卸载干净的情况下再次安装时会出现很多问题&#xff0c;导致安装失败。这…

KubeSphere部署芋道源码ruoyi-vue-pro

KubeSphere环境准备 新建企业空间 新建项目 创建harbor镜像服务信息 新建DevOps 项目 创建git,harbor,kubeconfig凭证 中间件部署 MySQL8部署redis6部署 后端部署 修改pom.xml <!-- pom.xml添加内容&#xff1a;--> <profiles><!-- 本地环境 --><pro…

《当今奇人周兴和》励志小说连载之三 ● 饥饿寒冷童年梦

饥饿寒冷童年梦 Hungry and cold childhood 兴和至今也记得&#xff0c;这年冬天特别冷。 Xinghe still remembers that the winter was particularly cold in that year. 那一天&#xff0c;放了学的小兴和背着书兜&#xff0c;又冷又饿地从毛公乡小学出来&#xff0c;艰难…

渠道控价的常见方法

品牌渠道一般分为线上和线下&#xff0c;现在常见要治理的渠道一般指的是线上&#xff0c;因为线上渠道数据变化快&#xff0c;价格波动也很大&#xff0c;促销信息有很多&#xff0c;如果遇到大促&#xff0c;涉及的价格变化将会更明显&#xff0c;所以线上渠道是非常值得控价…

OA办公自动化系统设计与实现(论文+源码)_kaic

摘要 随着信息化建设的日益深入&#xff0c;无论是政府还是企事业单位&#xff0c;部门之间的信息沟通与协调工作越来越重要。人们迫切需要一个能充分利用网络优势&#xff0c;并可以管理企业的各种重要信息的软件平台&#xff0c;利用该平台快速建立自己的信息网络和办公管理系…

华为PMS API client token auth failed

对接华为pms时出现问题&#xff0c;提示华为PMS API client token auth failed 主要是权限的问题&#xff0c;创建项目的时候选择N/A

u盘数据不知道什么时候全没了怎么恢复

案例&#xff1a;“你好&#xff0c;我发现我的U盘上的所有数据都不知何时消失了&#xff0c;我之前保存了许多重要的文件和照片&#xff0c;U盘数据不知道什么时候全没了怎么恢复&#xff1f;大神你知道么” 随着U盘的广泛应用&#xff0c;数据丢失问题也日益突出。很多人发现…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

chrome扩展在popup、background、content之间通信解决传输文件问题

文章目录 背景介绍案例介绍代码示例popup页面&#xff0c;上传文件页面popup页面&#xff0c;js上传代码&#xff0c;file文件转base64background监听消息&#xff0c;base64转file文件&#xff0c;axios上传 附-转base64后直接下载 背景介绍 示例扩展API版本MV2。 以弹…

Linux下安装配置Redis

文章目录 安装依赖库上传安装包并解压 启动默认启动指定配置启动开机自启 安装 依赖库 Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; yum install -y gcc tcl上传安装包并解压 将Redis安装包上传到服务器的任意目录&#xff0c;例…

使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

问题 未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式&#xff0c;使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 原因 在Spring框架中&#xff0c;WebMvcConfigurationSupport 是一个类&#xff0c;它可以用于自定义Spring MVC的配置…

【word密码】如何解密word密码?

Word文档常见的两种加密方式&#xff0c;打开密码和限制编辑&#xff0c;这两种密码对word文档加密&#xff0c;今天我们来讲一下这三种加密如何解密 解密一&#xff1a;打开密码 设置了打开密码的word文件&#xff0c;想要解密&#xff0c;我们需要先输入密码进入到文件当中…

IO进程线程第四天(8.1)opendir,closedir,readdir

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

华为OD机试真题 JavaScript 实现【箱子之形摆放】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例…