记录————封装vue3+element-plus(el-upload)上传图片组件

AI介绍:

  1. 显示已上传的图片列表,并提供删除和预览功能。
  2. 支持上传新的图片,并在上传成功后显示在列表中。

代码的具体步骤如下:

  • 在模板中,使用v-for指令遍历imageUrls数组,显示已上传的图片,并为每张图片绑定鼠标移入和移出事件。
  • 使用el-upload组件实现图片上传功能,配置了上传成功、上传前、上传进度等事件的处理函数。
  • 使用el-dialog组件实现图片预览功能,点击图片时弹出对话框显示大图。
  • 在脚本部分,使用refwatch来监听图片列表的变化,并处理上传成功、上传前、预览、删除等操作的逻辑。
  • 使用showIcons函数控制鼠标移入移出时的图标显示和隐藏。

整体来说,该代码实现了一个功能完善的图片上传组件,用户可以上传、预览和删除图片。
在这里插入图片描述

父组件使用:
双向绑定后数据会更新

<UploadImg v-model:img-list="formData.afterRepairImg"></UploadImg>

子组件即封装

<template><div class="img-box"><div class="image-container" v-for="(item, i) in imageUrls" :key="item"><img class="image" :src="item" @mouseover="showIcons" @mouseleave="hideIcons" /><div class="icon-container" v-show="showIcons"><el-icon class="zoom-icon" @click="handlePictureCardPreview(item)"><zoom-in /></el-icon><el-icon class="delete-icon" @click="handleRemove(i)"><Delete /></el-icon></div></div><el-uploadclass="avatar-uploader"action="#"list-type="picture-card":http-request="customUpload":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload":on-preview="handlePictureCardPreview":file-list="fileList":show-file-list="false"multiple><el-icon class="avatar-uploader-icon"><Plus /></el-icon></el-upload></div><el-dialog v-model="dialogVisible" width="90%" top="20px"><img w-full :src="dialogImageUrl" alt="Preview Image" /></el-dialog>
</template><script lang="ts" setup>
import { ref, watch } from 'vue'import { UploadProps, ElMessage, UploadUserFile } from 'element-plus'
import { photoUploadFileAPI } from '@/api/upload'
import { Delete, Download, Files, Plus, ZoomIn } from '@element-plus/icons-vue'const props = defineProps({imgList: {type: Array,required: true}
})const imageUrl = ref('')
const imageUrls = ref([])
const fileList = ref<UploadUserFile[]>([])
const emit = defineEmits(['update:imgList'])// 监听 imgList 的变化
watch(() => props.imgList,(newVal, oldVal) => {if (newVal.length > 0) {// console.log('父组件图片数组', props.imgList, fileList)imageUrls.value = newVal as any}// 在这里可以执行其他逻辑}
)
const handleAvatarSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {// console.log('你从', response, uploadFile)imageUrl.value = URL.createObjectURL(uploadFile.raw!)
}// 上传文件,请求接口,并且将结果存储
function customUpload(file: any) {let formData = new FormData()// console.log('查看', file.file)formData.append('file', file.file)photoUploadFileAPI(formData).then((res: any) => {const imgUrl = res.data.dataimageUrls.value.push(imgUrl)console.log('图片提交返回', res, imageUrls, fileList)emit('update:imgList', imageUrls)})
}
const beforeAvatarUpload: UploadProps['beforeUpload'] = rawFile => {const isImage = rawFile.type.startsWith('image/') // 检查是否为图片类型if (!isImage) {ElMessage.error('只能上传图片文件!')return false}// if (rawFile.type !== 'image/jpeg') {//   ElMessage.error('Avatar picture must be JPG format!')//   return false// } else if (rawFile.size / 1024 / 1024 > 2) {//   ElMessage.error('Avatar picture size can not exceed 2MB!')//   return false// }return true
}const handleUploadProgress: UploadProps['onProgress'] = (event, file, fileList) => {// 处理上传进度的逻辑,例如更新进度条状态const uploadFile = fileList.find(item => item.uid === file.uid)if (uploadFile) {uploadFile.percentage = event.percent  // 更新上传进度fileList.value = [...fileList]  // 更新文件列表}const fileItem = fileList.value.files.find((f: any) => f.file === file);if (fileItem) {fileItem.progress = Math.round(event.percent);}
}const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const disabled = ref(false)const handlePictureCardPreview: UploadProps['onPreview'] = uploadFile => {dialogImageUrl.value = uploadFile as anydialogVisible.value = true
}const handleRemove = (i: number) => {// 从 fileList 中移除被删除的文件// fileList.value = fileList.value.filter(file => file.uid !== uploadFile.uid)imageUrls.value.splice(i, 1)console.log(i, imageUrls)emit('update:imgList', imageUrls)
}const showControlsIcons = ref(false)
const showIcons = () => {// console.log('鼠标移入')showControlsIcons.value = true
}const hideIcons = () => {// console.log('鼠标移出')showControlsIcons.value = false
}
</script><style lang="scss" scoped>
.img-box {width: 100%;display: flex;flex-wrap: wrap;
.image-container {position: relative;display: inline-block;cursor: pointer;img {border: 1px dashed var(--el-border-color);font-size: 28px;color: #8c939d;width: 150px;height: 150px;text-align: center;border-radius: 10px;object-fit: cover;margin: 0 1px;}
}
}.icon-container {position: absolute;top: 0;left: 0;// top: 50%;// left: 50%;// transform: translate(-50%, -50%);display: flex;align-items: center;justify-content: center;background-color: rgba(0, 0, 0, 0.5);color: #fff;width: 150px;height: 150px;border-radius: 10px;opacity: 0;transition: opacity 0.3s;.el-icon {font-size: 20px;margin: 0 10px;
}
}.image-container:hover .icon-container {opacity: 1;
}.avatar-uploader .avatar {width: 178px;height: 178px;display: block;
}</style><style lang="scss">
.avatar-uploader .el-upload {border: 1px dashed var(--el-border-color);border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;transition: var(--el-transition-duration-fast);
}.avatar-uploader .el-upload:hover {border-color: var(--el-color-primary);
}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;text-align: center;
}.el-upload-list__item {align-items: center;
}.el-dialog__body {margin-top: 20px;text-align: center;img {min-height: 50vh;}
}
</style>

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

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

相关文章

ssm060基于SSM的高校共享单车管理系统的设计与实现+vue(论文+源码)_kaic

设计题目&#xff1a;高校共享单车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0…

FastReport将停止 .NET Framework 上的 WebReport 更新

从2024/ 12 /1 日起&#xff0c;Fastreport将停止发布更新和提供对 FastReport.Web (.NET Framework) 的技术支持。该库一直是使用 Online Designer 的许多项目中报告的核心。这些更改意味着 FastReport.Web (Legacy) 库&#xff08;FastReport.Net包的一部分&#xff09;将不再…

FPGA高速设计之Aurora64B/66B的应用与不足的修正

FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料&#xff0c;来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出&#xff0c;是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…

【力扣打卡系列】单调栈

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉&#xff0c;不可能出现上面大下面小的…

一个例子来说明Ada语言的实时性支持

Ada是一种专为工程应用和实时系统设计的编程语言&#xff0c;它提供了丰富的特性来确保程序的实时性和可靠性。下面是一个简化的例子&#xff0c;展示了Ada如何用于编写飞机电子控制器的代码&#xff0c;并说明Ada的实时性是如何保证的。 Ada实时性的关键特性&#xff1a; 任务…

C/C++语言基础--C++模板与元编程系列三(变量模板、constexpr、萃取等…………)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 模板与元编程是C的重要特点&#xff0c;也是难点&#xff0c;本人预计将会更新10期左右进行讲解&#xff0c;这是第三期&#xff0c;讲变量模板、constexpr、萃取等知识&#xff1b;C语言后面也会继续更新知…

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

RAG 系统的分块难题:小型语言模型如何找到最佳断点?

之前我们聊过 RAG 里文档分块 (Chunking) 的挑战&#xff0c;也介绍了 迟分 (Late Chunking) 的概念&#xff0c;它可以在向量化的时候减少上下文信息的丢失。今天&#xff0c;我们来聊聊另一个难题&#xff1a;如何找到最佳的分块断点。 虽然迟分对边界位置不敏感&#xff0c;…

服务器作业2

关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件 创建用户nfs-upload [rootlocalhost ~]# useradd -u 210 nfs-upload [rootlocalhost ~]# groupmod -g 210 nfs-upload 创建tom用户 [rootlocalhost ~]# useradd tom 查看to…

Java爱情交友婚恋系统小程序源码

&#x1f491;【恋爱攻略】交友婚恋系统&#xff0c;遇见对的TA不再难&#xff01;&#x1f496;&#x1f4ab; &#x1f48c; 开篇&#xff1a;数字时代&#xff0c;寻觅真爱的新方式 在这个快节奏的数字时代&#xff0c;寻找真爱似乎成了一件既期待又头疼的事情。&#x1f…

飞牛fnOs内网穿透-使用Lucky实现ipv6动态解析+HTTPS访问NAS服务

&#x1f9ed;Lucky官方介绍 Lucky最初是作为一个小工具&#xff0c;由开发者为自己的个人使用而开发&#xff0c;用于替代socat&#xff0c;在小米路由AX6000官方系统上实现公网IPv6转内网IPv4的功能。Lucky的设计始终致力于让更多的Linux嵌入式设备运行&#xff0c;以实现或…

Java外卖霸王餐CPS优惠CPS平台自主发布小程序系统源码

外卖霸王餐CPS平台系统&#x1f37d;️&#xff1a;省钱吃大餐的新神器 &#x1f389; 引言&#xff1a;霸王餐不再是梦 在这个快节奏的生活中&#xff0c;外卖已经成为了我们日常饮食的重要组成部分。然而&#xff0c;每次点外卖都要精打细算&#xff0c;是否让你感到疲惫&a…

Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展&#xff0c;人们的…

qt QFile详解

1、概述 QFile类是Qt框架中用于读取和写入文本和二进制文件资源的I/O工具类。它继承自QFileDevice类&#xff0c;后者又继承自QIODevice类。QFile类提供了一个接口&#xff0c;允许开发者以二进制模式或文本模式对文件进行读写操作。默认情况下&#xff0c;QFile假定文件内容为…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…

初阶数据结构【TOP】- 16. 经典八大排序对比

文章目录 前言一、相关复杂度二、相关稳定性三、表格总结总结 前言 本篇文章笔者将会对排序算法的所有时间复杂度和稳定性进行分析. 一、相关复杂度 ● 简单选择排序 首先,选择排序的效率是不高的 , 时间复杂度考虑的是最坏情况 , 那么对于选择排序来说, 最坏情况下需要进行…

Postman断言与依赖接口测试详解!

在接口测试中&#xff0c;断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性&#xff0c;还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具&#xff0c;不仅支持发送HTTP请求和接收响应&#xff0c;还提供了丰富的断言功能&#xff0c;帮助测试…

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个九宫格日志系统

基于 JAVASSM&#xff08;Java Spring Spring MVC MyBatis&#xff09;框架开发一个九宫格日志系统 步骤一&#xff1a;需求分析 明确系统需要实现的功能&#xff0c;比如&#xff1a; 用户注册和登录添加日志&#xff08;包含标题、内容、图片&#xff09;查看日志列表…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享&#xff0c;完整题目&#xff0c;无答案&#xff08;共8套&#xff09; 实习岗位…