element upload上传图片,上传完成隐藏组件或者禁用上传

背景:

在项目开发,需要上传图片,一张或者多张。当上传1张图片时,upload组件有一张图片时,组件自带的disable=true设置为true禁用上传,就不会触发上传接口了,但是还是可以点开图片进行选择,【优化为:已经上传一张,就不可以触发选择,即不选择图片不上传接口】;当一张图片的时候,通过改变upload组件的css样式隐藏组件,使用:class=" 'isActive' : 条件  "通过变量控制upload组件的显示与否;当上传多张图片的时候,同上传1张的逻辑一样,只是数量不同。

 一、上传1张图片

实现效果:

结果分析:

通过组件的limit='1'属性设置为1张,并且组件的disable属性变成了true。这个时候实现的效果是:当成功上传一张图片,并且上传组件已经被禁用,不能够触发选择图片的弹框。这已经能够实现上传单张的效果了,但是项目要求,上传一张还想重新删除、再上传,这时候发现已经上传的图片只有预览,删除按钮不见了,这个时候需要想办法把删除按钮显示出来。

解决思路:

类似于自定义一张icon的绝对定位,让它显示在图片上面。

解决办法:

官方文档:点击访问官网

 封装的组件代码:

<el-uploadlist-type="picture-card":limit="1":file-list="upImgState.fileList":style="{width: item.width || '10vw',height: item.width || '10vw',}":action="item.option.importUrl":data="item.option.uploadParames":show-file-list="true":headers="{ Authorization: store.userInfo.token }":on-success="(info) => uploadSingleImg('success', info, item)":on-error="(info) => uploadSingleImg('error', info)":before-upload="beforeUploadSingleImg":before-remove="(info) => beforeRemoveSingleImg('remove', info, item)":on-preview="handlePictureCardPreview"accept="image/jpeg,image/png":disabled="upImgState.fileList.length? true: false"><el-icon class="avatar-uploader-icon"><Plus /></el-icon><template #file="{ file }"><div><imgclass="el-upload-list__item-thumbnail":src="file.url"alt=""/><span class="el-upload-list__item-actions"><spanclass="el-upload-list__item-preview"@click="handlePictureCardPreview(file)"><el-icon><zoom-in /></el-icon></span><spanclass="el-upload-list__item-delete"@click="beforeRemoveSingleImg('remove', file, item)"><el-icon><Delete /></el-icon></span></span></div></template></el-upload><el-dialog v-model="upImgState.dialogVisible"><img:src="upImgState.dialogImageUrl"alt="Preview Image"style="width: 100%"/></el-dialog>
<script>
const uploadSingleImg = (state, info, item) => {if (state === "success") {const { data: resData } = info;item.getRowInfo(resData);upImgState.dialogImageUrl = BASEUrl + "/file/" + resData;const _fileList = upImgState.fileList || [];_fileList.unshift({ url: upImgState.dialogImageUrl });upImgState.fileList = _fileList;}ElMessage({type: state,message: `单个文件上传${state === "success" ? "成功" : "失败"}`,});
};
const beforeUploadSingleImg = (rawFile) => {if (!rawFile) return false;if (rawFile.type !== "image/jpeg" && rawFile.type !== "image/png") {ElMessage.error("文件类型须为图片格式!");return false;} else if (rawFile.size / 1024 / 1024 > 10) {ElMessage.error("文件大小须小于10MB!");return false;}return true;
};
const beforeRemoveSingleImg = (state, info, item) => {if (state === "remove") {console.log("info", info);const _fileName = info.url.split("/")[info.url.split("/").length - 1];const _fileType = item.option.uploadParames.fileType;item.removeImg({title: "删除图片",fileName: _fileName,fileType: _fileType,});upImgState.fileList = [];}return true;
};
const upImgState = reactive({dialogVisible: false, //预览弹框显示与否dialogImageUrl: "",fileList: [],
});
const handlePictureCardPreview = (file) => {upImgState.dialogImageUrl = file.url || BASEUrl + file.url;upImgState.dialogVisible = true;
};</script>

如何使用封装的组件:

//没有写完,只只是个传参示例
{type: "uploadSingleImg",label: "渡船图片",key: "photo",option: {uploadParames: {fileType: 2,},img_bg: "table/upload.png",info: "upload",text: "上传",importUrl: BASEUrl + "/data/file/upload",},width: "100%",getRowInfo: (data) => {console.log("上传图片的结果", data);state.formItemsVal.photo = data;},removeImg: (data) => {console.log("删除图片的结果", data);api.fileApi.deleteFile({ fileName: data.fileName, fileType: data.fileType }).then((res) => {if (res.status === 200 && res.data.code === 200) {ElMessage({type: "success",message: "删除成功",});} else {ElMessage({type: "error",message: res.data.message || "删除失败",});}}).catch((err) => {console.log(err);});},},

备注:

上传图片这里我选用的是自动上传,所以当我选中一张图片就会触发上传接口,根据接口就会返回一个{},包括但不限于:图片的相对路径、图片的名称等等。

这里需要注意的是图片相对路径,要显示在界面上,需要图片代理,最好使用BASEUrl,根据 const BASEUrl = import.meta.env.VITE_USER_NODE_ENV === 'development' ?判断开发环境还是生产环境,进行拼接访问路径。

图片新增,需要拼接访问前缀【也可以不要,但是要预览就需要】;图片复现,需要拼接访问前缀,图片编辑接口,需要去掉访问前缀。

图片删除接口,需要对应的文件名+文件类型,依据接口文档。

图片回显,需要拼接前缀:

 

编辑操作:

 删除操作:

 

二、上传多张图片

效果展示:

上传多张图片的时候,最后一张图片也没有删除按钮,最后一张只有预览按钮:

解决方式:

同一张图片一样:

 

三、上传一张图片后,隐藏upload组件

效果实现:

核心代码:

        <el-upload:auto-upload="false"list-type="picture-card":on-preview="handlePictureCardPreview":on-change="uploadSingleImg":limit="5":file-list="upImgState.fileList":class="upImgState.fileList.length !== 0 ? 'isHidden' : ''"><el-icon v-if="upImgState.fileList.length == 0"><Plus /></el-icon></el-upload><el-dialog v-model="upImgState.dialogVisible"><img:src="upImgState.dialogImageUrl"alt="Preview Image"style="width: 100%"/></el-dialog>//css样式
.isHidden{.el-upload--picture-card {display: none;}:deep(.el-upload--picture-card) {display: none;}
}

写在最后:

两种方式限制上传的数量,当限制1张的时候,使用upload组件自带的disable属性禁用组件;使用动态class绑定一个变量控制是否显示upload上传框。 

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

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

相关文章

【2024年华为OD机试】 (A卷,100分)- 二元组个数(Java JS PythonC/C++)

一、问题描述 以下是题目描述的 Markdown 格式&#xff1a; 题目描述 给定两个数组 a 和 b&#xff0c;若 a[i] b[j]&#xff0c;则称 [i, j] 为一个二元组。求在给定的两个数组中&#xff0c;二元组的个数。 输入描述 第一行输入 m&#xff0c;表示第一个数组的长度。第二…

Homebrew 【MAC安装软件利器】

1、brew介绍 Homebrew游来: Homebrew 的诞生源于一个年轻程序员的不满和创新。2009 年&#xff0c;Max Howell 当时是一名在苹果公司工作的程序员。他觉得在 Mac 上安装和管理开源软件特别麻烦&#xff0c;常常需要手动下载源代码、解决依赖关系、编译安装&#xff0c;过程繁琐…

AOP实现操作日志记录

文章目录 1.common-log4j2-starter1.目录2.pom.xml 引入依赖3.LogAspect.java4.Log4j2AutoConfiguration.java Log4j2自动配置类条件注入切面类 2.common-log4j2-starter-demo 测试1.目录2.application.yml 启用日志切面3.TraceController.java4.结果 1.common-log4j2-starter …

JavaEE之线程池

前面我们了解了多个任务可以通过创建多个线程去处理&#xff0c;达到节约时间的效果&#xff0c;但是每一次的线程创建和销毁也是会消耗计算机资源的&#xff0c;那么我们是否可以将线程进阶一下&#xff0c;让消耗计算机的资源尽可能缩小呢&#xff1f;线程池可以达到此效果&a…

YOLOv11改进,YOLOv11添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超分辨率重建

摘要 基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合…

Shader -> SweepGradient扫描渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…

LabVIEW调用不定长数组 DLL数组

在使用 LabVIEW 调用 DLL 库函数时&#xff0c;如果函数中的结构体包含不定长数组&#xff0c;直接通过 调用库函数节点&#xff08;Call Library Function Node&#xff09; 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配&#xff0c;而包含不定长数…

IOS开发如何从入门进阶到高级

针对iOS开发的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作&#xff0c;汇集了大量开…

Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式

业务场景 在目前常见的中后台管理系统中&#xff0c;比较常见的是固定的布局方式包裹页面&#xff0c;但一些特殊页面&#xff0c;比如&#xff1a;登录页面、注册页面、忘记密码页面这些页面是不需要布局包裹的。 但在 Next.js AppRouter 中&#xff0c;必须包含一个根布局文…

基于 Python 和 OpenCV 的人脸识别上课考勤管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

PHP语言的函数实现

PHP语言的函数实现 在现代Web开发中&#xff0c;PHP是一种流行的后端脚本语言。它以简单易学和强大的功能著称&#xff0c;广泛应用于构建动态网站和Web应用程序。在PHP中&#xff0c;函数是组织代码、提高代码重用性和可读性的关键元素。本文将深入探讨PHP的函数实现&#xf…

人工智能与物联网:智慧城市的未来

引言 清晨6点&#xff0c;智能闹钟根据你的睡眠状态和天气情况&#xff0c;自动调整叫醒时间&#xff1b;窗帘缓缓打开&#xff0c;阳光洒满房间&#xff1b;厨房里的咖啡机已经为你准备好热饮&#xff0c;而无人驾驶公交车正按时抵达楼下站点。这不是科幻电影的场景&#xff…

小R的蛋糕分享

小R的蛋糕分享 问题描述 小R手里有一个大小为 n 行 m 列的矩形蛋糕&#xff0c;每个小正方形区域都有一个代表美味度的整数。小R打算切割出一个正方形的小蛋糕给自己&#xff0c;而剩下的部分将给小S。她希望两人吃的部分的美味度之和尽量接近。 我们定义小R吃到的部分的美味度…

使用postMessage解决iframe与父页面传参

接收传递的消息时&#xff0c;可以将 window.addEventListener(message, function(e) { console.log(e.data) }) 写法&#xff0c;更换为 window.onmessage async function(e) {} 可以避免消息发送后&#xff0c;多次接收该参数 父页面js IframeEvent(){const send …

python-leetcode-无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_set set()left 0max_length 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left 1char_…

新版本的IDEA如何解决Git分支显示为警告⚠<unknown>的问题

目录 问题再现 解决思路 首先我们要想到 这个分支有没有从远程代码仓库拉去下来 复习一下 git 命令 其次思考 最后思考 问题再现 这边我使用的是 IDEA 2024.3.3.1 Jetbrains 官网的最新版 同时也是官方账号登录 的 今天上 github 去拉项目到 本地 出现了分支不显示的问…

libusb学习——简单介绍

文章目录 libusb 简介libusb 编译libusb 源码目录介绍核心代码文件平台支持例子 API使用libusb初始化和去初始化libusb设备处理和枚举libusb 杂项libusb USB描述符libusb 设备热插拔事件通知libusb 异步设备I/Olibusb 同步设备I/Olibusb 轮询与定时 libusb 涉及技术参考 libusb…

GRE技术的详细解释

GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;是一种隧道协议&#xff0c;主要用于在不同网络之间封装和传输其他网络层协议的数据包。它最常用于在IP网络上建立虚拟点到点的隧道连接&#xff0c;是实现VPN的一项关键技术。 下面从原理、…

HarmonyOS 鸿蒙Next 预览pdf文件

HarmonyOS 鸿蒙Next 预览pdf文件 1、使用filePreview 2、使用web组件 在线pdf&#xff08;网址是直接下载的&#xff0c;不是直接可以预览的&#xff09;&#xff0c;先下载再预览 import media from ohos.multimedia.media;import web_webview from ohos.web.webview;import …

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…