vue3+ el-upload封装上传组件

  1. 组件功能介绍
    • 上传格式限制
    • 上传大小限制
    • 上传文件数量限制
    • 自定义上传区
    • 上传成功回调
    • 禁用上传开关与点击上传自定义事件
    • 暴露所以上传文件列表(uploadList)与当前文件数据(uploadLatestFile
  2. 组件代码Upload.vue
<template><div><div><el-uploadclass="flx-align-center":file-list="fileList":multiple="multiple":limit="limit":disabled="disabled":accept="fileType":show-file-list="false":http-request="handleHttpUpload":before-upload="beforeUpload":on-exceed="handleExceed"><slot name="upload-btn"><div class="upload-content"><el-button type="primary" :icon="UploadFilled" plain @click="handleClick">点击上传</el-button></div></slot></el-upload><!-- 提示 --><div class="upload-tip" v-if="tipShow"><slot name="tip">{{ tipComputed }}</slot></div></div><div class="upload-box"><slot></slot></div></div>
</template><script setup lang="ts" name="UploadBasics">
import { ref, computed } from "vue";
import { UploadFilled } from "@element-plus/icons-vue";
import type { UploadUserFile } from "element-plus";
import { ElNotification } from "element-plus";
import { uploadImg } from "@/api/modules/upload";
import { getFileType } from "@/utils/assetsFile";interface UploadFileProps {fileType: string;fileSize: number; // 允许上传文件的最大尺寸limit: number; // 允许上传文件的最大数量tipShow: boolean; // 是否显示提示multiple: boolean; // 是否可以多选fileList: UploadUserFile[];disabled: boolean;handleClick: () => void; // 点击上传按钮自定义事件, 可在禁用时触发
}const props = withDefaults(defineProps<Partial<UploadFileProps>>(), {fileType: ".pdf, .jpg, .png, .jpeg",fileSize: 10,tipShow: true,multiple: true,fileList: () => [],disabled: false
});// 提示
const tipComputed = computed(() => {const tip = props.fileType.replace(/\./g, "").replace(/,/g, "、").toUpperCase();return `支持${tip}格式,大小不得超过${props.fileSize}M`;
});// 文件上传前的钩子
const beforeUpload = rawFile => {// 判断文件类型, 不显示小数点const extension = getFileType(rawFile.name, 1);const fileType = props.fileType.replace(/\./g, ""); // 若传入类型有小数点,替换const imgType = fileType.includes(extension);if (!imgType) {ElNotification({title: "温馨提示",message: "上传图片不符合所需的格式!",type: "warning"});return false;}// 判断大小if (rawFile.size / 1024 / 1024 > props.fileSize) {ElNotification({title: "温馨提示",message: `上传图片大小不能超过 ${props.fileSize}M!`,type: "warning"});return false;}
};const handleExceed = () => {ElNotification({title: "温馨提示",message: `超出文件上传最大数量:${props.limit}`,type: "warning"});return false;
};// 上传文件请求
const uploadLatestFile = ref<UploadUserFile>(); // 最近上传的文件
const uploadList = ref<UploadUserFile[]>([]); // 所有上传的文件列表const handleHttpUpload = async options => {let formData = new FormData();formData.append("file", options.file);try {
// 上传请求const { data } = await uploadImg(formData);uploadLatestFile.value = {name: data.data.name as string,url: data.data.url};uploadList.value = [...uploadList.value,{name: data.data.name as string,url: data.data.url}];emits("upload-success", { uploadLatestFile: uploadLatestFile.value, uploadList: uploadList.value });} catch (error) {options.onError(error as any);}
};const emits = defineEmits(["upload-success"]);defineExpose({uploadList,uploadLatestFile
});
</script><style lang="scss" scoped>
// 上传按钮区
.upload-content {display: flex;flex-direction: column;
}// 上传文件显示容器
.upload-box {max-height: 400px;// margin-top: 10px;overflow: auto;
}// 提示
.upload-tip {display: flex;align-items: center;font-size: 12px;line-height: 32px;color: var(--el-label-color-regular);
}
</style>
  1. 使用示例一:
  • 使用默认的上传按钮
<Uploadref="uploadRef":file-size="20":limit="10":file-list="uploadItemRef?.newFileList"file-type="zip,png,jpg,jpeg,doc,docx,xls,xlsx,pdf,ppt,pptx"direction="horizontal"
>
<UploadItem ref="uploadItemRef" :file-list="fileList" :upload-list="uploadRef?.uploadList" />
</Upload>// UploadItem 是展示内容
  • 效果图展示:
    image.png
  1. 使用示例二:使用自定义的上传按钮
  • Upload上传组件内部使用UploadItem展示文件,展示文件内部又有上传功能:
<Upload ref="uploadRef"><UploadItem :file-list="dataList" :upload-list="uploadRef?.uploadList" />
</Upload>
  • UploadItem.vue 内:
<div class="file-div flx-justify-between" v-for="(item, index) in list" :key="index"><div class="flx-align-center"><img :src="getFileTypeImg(item.url)" :alt="item.name" /><span v-if="isExt">{{ item.name }}</span><!-- <span v-else>{{ item.name }}{{ getFileType(item.url) }}</span> --><span v-else>{{ item.name }}</span></div><div class="upload-btns"><el-button v-if="isDown" type="primary" text @click="handleDown(item)"> 下载 </el-button><Upload :tip-show="false" :multiple="false" @upload-success="uploadSuccess($event, item)"><template #upload-btn><img src="@/assets/images/disposal/reactupload.png" alt="reactupload" class="reactupload" /></template></Upload></div></div>
  • 效果图
    image.png

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

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

相关文章

在Stimulsoft 报告中连接来自 MySQL 的数据

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Firewalld 防火墙基础

Firewalld 防火墙基础 一、Firewalld概述firewalld 简介firewalld 和 iptables 的关系firewalld 与 iptables service 的区别 二、Firewalld 网络区域区域介绍Firewalld数据处理流程 三、Firewalld 防火墙的配置方法firewall-config 图形工具“区域”选项卡“服务”选项卡改变防…

仓库管理系统24--统计报表

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、引用LiveCharts 2、创建LiveChartViewModel using GalaSoft.MvvmLight; using LiveCharts.Wpf; using LiveCharts; using Sy…

从新手到高手:Scala函数式编程完全指南,Scala 数据类型(4)

1、Scala 数据类型 Scala 与 Java有着相同的数据类型&#xff0c;下表列出了 Scala 支持的数据类型&#xff1a;

ros1仿真导航机器人 navigation

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1navigation导航框架 2导航设置过程 &#xff08;1&#xff09;启动仿真环境 roslaunch why_simulation why_robocup.launch &#xff08;2&#xff09;启动move_base导航、amcl定位 roslaunch why_simulation nav…

无偏归一化自适应心电ECG信号降噪方法(MATLAB)

心电信号作为一种生物信号&#xff0c;含有大量的临床应用价值的信息&#xff0c;在现代生命医学研究中占有重要的地位。但心电信号低频、低幅值的特点&#xff0c;使其在采集和传输的过程中经常受到噪声的干扰&#xff0c;使心电波形严重失真&#xff0c;从而影响后续的病情分…

你还不会买智能猫砂盆吗?跟你们详细讲解今年最火的智能猫砂盆!

智能猫砂盆的坑&#xff0c;想必有很多养猫家庭都踩过吧。自己买回来的机器&#xff0c;不是空间不够大&#xff0c;导致猫咪拉到外面去&#xff0c;就是铲不干净&#xff0c;还得自己进行二次清理&#xff0c;搞得这个智能猫砂盆白买了。那如果我们想要购买合适自己家猫咪的智…

数据链路层分析

文章目录 前言一、数据链路层概述二、终端之间的通信三、帧格式1.Ethernet_II型2.IEEE 802.3 四、MTU分析五、数据帧的传输1.MAC地址2.单播3.广播4.组播5.数据帧的收发 前言 网络中传输数据需要定义并遵循一些标准&#xff0c;以太网是根据IEEE802.3标准来管理和控制数据帧的&…

sqlserver开启CDC

1、背景 由于需要学习flink cdc&#xff0c;并且数据选择sqlserver&#xff0c;所以这里记录sqlserver的cdc开启操作步骤。 2、基础前提 官方介绍地址&#xff1a;https://learn.microsoft.com/zh-cn/sql/relational-databases/track-changes/enable-and-disable-change-dat…

如何优化前端性能:提高网页加载速度的实用技巧

我们在前端开发中&#xff0c;性能优化是提高用户体验的关键因素。网页加载速度直接影响用户的满意度和留存率。本文将介绍几种优化前端性能的实用方法&#xff0c;帮助你提高网页加载速度。 问题描述 &#xff1a; 首先前端性能优化涉及多个方面&#xff0c;包括减少HTTP请…

专为运维工程师设计!阿里藏经阁出品的Python实战手册被我搞来了

Python 可能是极少数既简单又强大的编程语言中的一种。更重要的是&#xff0c;用它来编程是非常快乐的事。 今天给小伙伴们分享的是阿里“藏经阁”出品的专门给运维工程师设计的Python实战手册 废话不多说&#xff0c;下面把内容展示给大家 01 Python快速回顾 02 Python脚本…

【大模型】基于ChatGLM进行微调及应用 [更新中......]

文章目录 一、前言二、说明2.1 代码结构2.2 依赖包版本 三、启动对话演示3.1 命令行交互 cli_demo.py3.2 网页交互 web_demo.py 四、微调模型4.1 基于 P-Tuning v2 微调模型4.1.1 软件依赖4.1.2 下载数据集4.1.3 下载模型文件4.1.4 操作步骤 4.2 基于 Full Parameter 微调模型4…

从进程到协程,浅谈Java提高CPU利用率的发展

综合CPU利用率来讲,计算机远古时期,为提高CPU利用率,有以下概念 串行进程->并行进程->线程->线程池>->虚拟线程(协程) 一,串行进程, 早期的操作系统对任务调度,往往从最简单的实现开端,串型进程意思是对分配的一个任务,其任务能百分百占用CPU,哪怕…

前程无忧滑块

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

日期时间显示网页

SweetOrange_Clock &#x1f558; 一、简介 1、这个项目包括一个HTML文件&#xff0c;其中包含页面的样式和脚本。 2、页面以优雅的黑白配色为主题&#xff0c;突出了实用性和视觉冲击力&#xff0c;使得显示内容在视觉上更为突出和易于阅读。 3、这是一个日期时间显示器。通…

高通源代码版本ADK工具版本源代码release版本MDE版本介绍

0 Preface/Foreword 1 版本介绍 高通代码存放在chipcode中&#xff0c;网址URL&#xff1a;Chipcode 1.1 高通源代码版本 Bluetooth Audo芯片的高通源代码版本号&#xff08;类似于分类的类名&#xff09;&#xff1a;ADK.SRC.1.0 &#xff08;最新qcc307x系列及之后的芯片如…

Pycharm安装依赖

1. IDE集成的错误解决 鼠标悬停,点击 install 2. 配置环境 ctrlalts 3. 终端运行pip (要求有先有一个pip) 最好用最简单

NSE and KGE

NSE&#xff08;Nash-Sutcliffe Efficiency&#xff09;&#xff1a; 解释&#xff1a;NSE 是衡量水文模型模拟结果与观测值之间拟合程度的指标。它计算模拟值与观测值之间的均方误差&#xff0c;并将其与观测值的方差进行比较。NSE 的取值范围为-∞至 1&#xff0c;值越接近 1…

切片的基础知识

文章目录 ● Slice 的底层实现原理&#xff1f;● array 和 Slice 的区别&#xff1f;● 拷贝大切片一定比小切片代价大吗&#xff1f;● Slice 深拷贝和浅拷贝&#xff1f;● 零切片、空切片、nil切片&#xff1f;● Slice 的扩容机制&#xff1f;● Slice 为什么不是线程安全…

WCCI 2024开幕,横滨圣地巡礼,畅游动漫与美食的世界

惊喜&#xff01;WCCI 2024开幕&#xff0c;横滨圣地巡礼&#xff01;畅游动漫与美食的世界 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&#xff0c;于6月30日至…