vue3+element plus 封装上传组件(图片、文件)

news2024/11/23 0:32:32

vue3+element plus 封装上传组件(图片、文件)

  • 1、新建封装组件components/upload.vue
  • 2、引入upload组件
  • 3、效果展示

1、新建封装组件components/upload.vue

<template>
  <el-upload 
  	v-model:file-list="waitFileList" 
  	class="upload-demo" 
  	:on-change="handleChange" 
  	multiple 
  	:auto-upload="false"
    :on-preview="handlePreview" 
    :on-remove="handleRemove" 
    :before-remove="beforeRemove" 
    :limit="limitNum"
    :on-exceed="handleExceed"
  >
    <el-button type="primary">上传文件</el-button>
    <template #tip>
      <div class="el-upload__tip">
        支持jpg/jpeg/png;图片大小不能超过2M;文件大小不超过20M;最多上传{{ limitNum }}个文件
      </div>
    </template>
  </el-upload>
</template>
<script setup>
import { ref, watch } from 'vue'
import { ElMessage, ElMessageBox, ElLoading } from "element-plus"
import { uploadFileApi } from '../api/upload'
const props = defineProps({
  action: {
    default: '/manager/energy/common/upload',
    type: String,
  },
  limitNum: {
    default: 5,
    type: Number,
  },
  type: {
    default: 1,
    type: Number,
  },
  projectId: {
    default: '',
    type: String,
  },
  fileList: {
    default: [],
    type: Array
  }
})

let waitFileList = ref([])
waitFileList.value = props.fileList
watch(
  () => props.fileList,
  () => {
    console.log("props.fileList====>", props.fileList)
    waitFileList.value = props.fileList
  }
)

const emits = defineEmits(["uploadSuccess", "updateFile"])

// 上传图片/文件
const handleChange = async (file, fileList) => {
  console.log(file)
  console.log(fileList)
  let rawFile = file.raw
  if (
    rawFile.type == "image/jpeg" && rawFile.size / 1024 / 1024 > 2 ||
    rawFile.type == "image/png" && rawFile.size / 1024 / 1024 > 2 ||
    rawFile.type == "image/jpg" && rawFile.size / 1024 / 1024 > 2
  ) {
    ElMessage.error("图片大小不能超过2MB!")
    fileList.splice(-1, 1) //移除当前超出大小的文件
    return false
  } else if (rawFile.size / 1024 / 1024 > 10) {
    ElMessage.error("文件大小不能超过10MB!")
    fileList.splice(-1, 1) //移除当前超出大小的文件
    return false
  } else {
    console.log('上传')
    const loadingInstance = ElLoading.service({
      text: "正在上传",
      background: "rgba(0,0,0,.2)",
    })
    // 请求接口上传文件到服务器
    console.log(rawFile)
    const res = await uploadFileApi(rawFile, props.projectId, props.type)
    console.log(res)
    if (res.code == 200) {
      loadingInstance.close()
      const obj = res.result
      console.log(11)
      emits("uploadSuccess", obj)
    } else {
      loadingInstance.close()
      console.log(22)
      ElMessage.warning(`上传失败`)
    }
  }
  return true
}


const handleRemove = (file, uploadFiles) => {
  console.log(file)
  console.log(uploadFiles)
  emits('updateFile', uploadFiles)
}

const handlePreview = (uploadFile) => {
  console.log(uploadFile)
}

const handleExceed = (files, uploadFiles) => {
  ElMessage.warning(
    `The limit is 3, you selected ${files.length} files this time, add up to ${files.length + uploadFiles.length
    } totally`
  )
}

const beforeRemove = (uploadFile, uploadFiles) => {
  return ElMessageBox.confirm(
    `确定移除 ${uploadFile.name}文件 ?`
  ).then(
    () => true,
    () => false
  )
}
</script>

2、引入upload组件

<template>
	<upload 
		:limitNum="12" 
		:type="4" 
		:projectId="explorationFormData.projectId"
        :fileList="explorationFormData.distributionRoom"
         @uploadSuccess="handleDistributionRoom"
         @updateFile="updateDistributionRoom"
     >
    </upload>
</template>
<script setup>
// 引入上传文件
import upload from '@/components/upload.vue'
const explorationFormData = ref({
	projectId: '',
	projectName: '',
	scene: [],  // 现场
	installationSite: [],  // 安装场地
	installationSiteOverview: '',  // 安装场地概述
	distributionRoom: [],  // 配电房
	distributionRoomOverview: '',  // 配电房概述
})
// 处理配电房上传成功信息
const handleDistributionRoom = (file) => {
  console.log(file)
  explorationFormData.value.distributionRoom.push(file)
}
// 更新配电房文件
const updateDistributionRoom = (files) => {
  console.log(files)
  explorationFormData.value.distributionRoom = files
}
</script>

3、效果展示

在这里插入图片描述

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

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

相关文章

阿里云矢量图标透明背景转换/展示时变为黑色解决方法

下载了一个矢量图标&#xff0c;背景是透明的 上传到minio然后在前端展示&#xff0c;发现透明&#xff08;白色&#xff09;的地方变成黑色了 处理方法&#xff1a;去除透明的底色。使用window的画图程序打开保存一遍&#xff0c;将透明色转为白色 OK

【UniApp开发小程序】小程序首页完善(滑到底部数据翻页、回到顶端、基于回溯算法的两列数据高宽比平衡)【后端基于若依管理系统开发】

文章目录 说明细节一&#xff1a;首页滑动到底部&#xff0c;需要查询下一页的商品界面预览页面实现 细节二&#xff1a;当页面滑动到下方&#xff0c;出现一个回到顶端的悬浮按钮细节三&#xff1a;商品分列说明优化前后效果对比使用回溯算法实现ControllerService回溯算法 优…

Mac网页开发工具 RapidWeaver 9

RapidWeaver是一款Mac上的网页设计和开发工具&#xff0c;它使用户能够快速创建专业级别的网站&#xff0c;而无需编写代码。 以下是RapidWeaver软件的一些主要特点和功能&#xff1a; 模板和主题&#xff1a;RapidWeaver提供了大量的预先设计好的模板和主题&#xff0c;使用…

【jvm】运行时数据区

目录 一、运行时数据区一、作用二、说明三、线程共用与私有区域 一、运行时数据区 一、作用 1.内存是非常重要的系统资源&#xff0c;是硬盘和CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策…

扫盲:OLTP和OLAP的区别

定义 OLTP是Online Transaction Processing的缩写&#xff0c;其中文含义为&#xff1a;联机事务处理&#xff1b; OLAP是Online Analysis Processing的缩写&#xff0c;其中文含义为&#xff1a;联机分析处理。 上世纪60年代&#xff0c;关系数据库之父E.F.Codd提出了关系模…

URL重定向漏洞

URL重定向漏洞 1. URL重定向1.1. 漏洞位置 2. URL重定向基础演示2.1. 查找漏洞2.1.1. 测试漏洞2.1.2. 加载完情况2.1.3. 验证漏洞2.1.4. 成功验证 2.2. 代码修改2.2.1. 用户端代码修改2.2.2. 攻击端代码修改 2.3. 利用思路2.3.1. 用户端2.3.1.1. 验证跳转 2.3.2. 攻击端2.3.2.1…

Stable Diffusion 提示词入门指南

前言 本文主要讲解 Stable Diffusion &#xff08;下文简称 SD&#xff09;提示词的用法&#xff0c;帮助大家生成更高质量的图片 本章节主要讲解文生图&#xff0c;其他类型读者可以自行探索。同时本文主要是以 Stable Diffusion Discard 的形式生成图片 如果各位对于图片隐…

leetcode idea debug 刷题debug神器

目录 1 安装leetcode editor插件2 创建刷题目录和包3 配置配置插件模板4 参考 配置好后debug效果&#xff0c;可以一步步debug设置断点查看各个变量的变化&#xff0c;也可以跳转到对应的方法查看源码&#xff01;&#xff01;&#xff01; 1 安装leetcode editor插件 这个直接…

小赢科技,寻找金融科技核心价

如果说金融是经济的晴雨表&#xff0c;是通过改善供给质量以提高经济质量的切入口&#xff0c;那么金融科技公司&#xff0c;就是这一切行动的推手。上半年&#xff0c;社会经济活跃程度提高背后&#xff0c;金融科技公司既是奉献者&#xff0c;也是受益者。 8月29日&#xff0…

智慧景区方案:AI与视频融合技术如何助力景区监管智能化升级?

随着经济的发展&#xff0c;人们对生活的需求也不再局限于温饱层面&#xff0c;越来越多的人们开始追求文化、艺术的高层次需求&#xff0c;旅游也逐渐成为人们日常放松的一种方式。由于我国人口多、易扎堆等特点&#xff0c;景区的运营监管方式也亟需改革。TSINGSEE青犀智能分…

118.杨辉三角

一、题目 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>data(numRows);for(int i0;i<numRows;i){data[i].resize(i1);//扩容data[i]…

java解析html

目录 场景描述一.引入依赖二.调用接口响应回来的html三.测试代码 场景描述 我调用外部接口&#xff0c;但是返回来的数据是html的格式&#xff0c;所以我就需要进行处理来获得我想要的数据。我使用的是jsoup。 一.引入依赖 <dependency><groupId>org.jsoup</gr…

C++:初始化表总结

1.为成员变量赋值2.指定基类的构造函数3.指定组合对象所在类的构造函数

Vue.js安装步骤和注意事项

安装完node.js后开始安装和部署Vue在检查webpack的下载版本时出现错误出现错误的原因是之前下载时未指定对应的版本号导致版本不兼容先卸载掉之前下载的版本 cnpm uninstall webpack-cli -g cnpm install webpack-cli4.9.2 -g 最后检查版本是否对应

【不会用这个工具,你的Linux服务器就是个摆设!】

01 Tcpdump Tcpdump 是一个强大的网络监控工具&#xff0c;它允许用户有效地过滤网络上的数据包和流量。 这可以获得有关 TCP/IP 和网络上传输的数据包的详细信息。 当你遇到网络协议问题一筹莫展的时候&#xff0c;这时候往往可以通过tcpdump来看网络的通讯过程中发生了什么…

Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin

Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.RE…

C++学习记录——삼십 智能指针

文章目录 1、为什么需要智能指针&#xff1f;2、内存泄漏3、智能指针的使用及原理1、RAII思想2、拷贝问题1、unique_ptr2、shared_ptr1、多线程2、循环引用3、定制删除器 1、为什么需要智能指针&#xff1f; 看一个场景 int div() {int a, b;cin >> a >> b;if (b…

初探---Qt

目录 一、介绍Qt 二、软件安装 三、QT工具介绍 四、Assistant帮助文档的使用 五、设计师界面的介绍 ​编辑 六、QT工程项目各文件初始程序的介绍 1> 配置文件&#xff1a;.pro文件 2> 头文件 3> 源文件 4> 主程序 5> 各文件之间调用方式 七、第一个…

一篇文章搞定《WebView的优化及封装》

一篇文章搞定《WebView的优化及封装》 前言WebView的过程分析确定优化方案一、预加载&#xff0c;复用缓冲池&#xff08;初始化优化&#xff09;优化的解析说明具体的实现 二、预置模版&#xff08;请求、渲染优化&#xff09;优化的解析说明具体的实现1、离线包2、预获取数据…