Vue3 上传后的文件智能预览(实战体会)

目录

  • 前言
  • 1. Demo1
  • 2. Demo2

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

爬虫神器,无代码爬取,就来:bright.cn

此处的基本知识涉及较少,主要以Demo的形式供大家学习,从实战中触发

本身url是在线链接且是以数组的形式存在

开源项目来源:https://gitee.com/zhijiantianya/ruoyi-vue-pro

1. Demo1

本身一开始以Minio的形式上传,以文件的形式进行命名:

在这里插入图片描述

后续用户需要一个个点击才能看到是什么文件

 <el-form-item label="单证附件" prop="imgPath"><UploadFile v-model="formData.imgPath" limit="10" /></el-form-item>
  1. 把 imgPath 按逗号分割为数组

  2. 遍历数组,每个链接:
    如果是图片(比如后缀是 .jpg、.png 等),就渲染成 <el-image>
    如果不是图片,就渲染成带下载链接的文件名

示例的Demo如下:

<template><div class="file-preview-list"><divv-for="(item, index) in fileList":key="index"class="preview-item"><el-imagev-if="isImage(item)":src="item":preview-src-list="[item]"fit="cover"style="width: 100px; height: 100px; margin-right: 10px;"><template #error><div style="font-size: 12px; color: #999;">加载失败</div></template></el-image><av-else:href="item"target="_blank"style="color: #409EFF; text-decoration: underline;">文件 {{ index + 1 }}</a></div></div>
</template><script setup>
import { computed } from 'vue';const props = defineProps({modelValue: String
});const fileList = computed(() => {return props.modelValue? props.modelValue.split(',').map(item => item.trim()): [];
});const isImage = (url) => {return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url);
};
</script><style scoped>
.file-preview-list {display: flex;flex-wrap: wrap;gap: 10px;
}
.preview-item {display: flex;align-items: center;
}
</style>

组件这样使用:

<el-form-item label="单证附件" prop="imgPath"><UploadFile v-model="formData.imgPath" limit="10" /><UploadPreview v-model="formData.imgPath" />
</el-form-item>

后续由于图片有些过大,对应以正在加载的形式呈现:

<template><div class="file-preview-list"><divv-for="(item, index) in fileList":key="index"class="preview-item"><el-imagev-if="isImage(item)":src="item":preview-src-list="[item]"fit="cover"style="width: 100px; height: 100px; margin-right: 10px;"><template #placeholder><divstyle="display: flex; align-items: center; justify-content: center; height: 100%; color: #aaa; font-size: 12px;">正在加载...</div></template><template #error><div style="font-size: 12px; color: #999;">加载失败</div></template></el-image><av-else:href="item"target="_blank"style="color: #409EFF; text-decoration: underline;">文件 {{ index + 1 }}</a></div></div>
</template><script setup>
import { computed } from 'vue';const props = defineProps({modelValue: String
});const fileList = computed(() => {return props.modelValue? props.modelValue.split(',').map(item => item.trim()): [];
});const isImage = (url) => {return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url);
};
</script><style scoped>
.file-preview-list {display: flex;flex-wrap: wrap;gap: 10px;
}
.preview-item {display: flex;align-items: center;
}
</style>

✅ 推荐结构(用 el-row + 两个 el-col)
原来的结构是把所有内容都放在了一个 el-form-item 里面,这样不太好控制布局

建议改成下面这样:

<el-row><!-- 左侧:上传控件 --><el-col :span="12"><el-form-item label="单证附件" prop="imgPath"><UploadFile v-model="formData.imgPath" limit="10" /></el-form-item></el-col><el-col :span="12"><div style="margin-bottom: 8px; font-weight: bold;">附件预览</div><UploadPreview v-model="formData.imgPath" /></el-col>
</el-row>

最终截图如下:

在这里插入图片描述

2. Demo2

另外一种呈现的方式如下:

<el-table-column label="照片" align="center" prop="imgPath" width="500" fixed="left"><template #default="{ row }"><div v-if="row.imgPath && row.imgPath.length > 0" class="damage-images"><el-imagev-for="(img, index) in row.imgPath":key="index"class="h-80px w-80px"lazy:src="img":preview-src-list="row.imgPath"preview-teleportedfit="cover"/></div><div v-else class="no-image">无图片</div></template>
</el-table-column>

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

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

相关文章

transformer-实现单层Decoder 层

Decoder Layer 论文地址 https://arxiv.org/pdf/1706.03762 解码器层结构 Transformer解码器层由三种核心组件构成&#xff1a; Masked多头自注意力&#xff1a;关注解码器序列当前位置之前的上下文&#xff08;因果掩码&#xff09; Encoder-Decoder多头注意力&#xff1a;关…

设计模式每日硬核训练 Day 16:责任链模式(Chain of Responsibility Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 15&#xff1a;享元模式小结 在 Day 15 中&#xff0c;我们学习了享元模式&#xff08;Flyweight Pattern&#xff09;&#xff1a; 通过共享对象&#xff0c;分离内部状态与外部状态&#xff0c;大量减少内存开销。适用于字符渲染、游戏场景、图标缓…

大数据开发环境的安装,配置(Hadoop)

1. 三台linux服务器的安装 1. 安装VMware VMware虚拟机软件是一个“虚拟PC”软件&#xff0c;它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比&#xff0c;VMWare采用了完全不同的概念。 我们可以通过VMware来安装我们的linux虚拟机…

多模态大语言模型arxiv论文略读(四十九)

When Do We Not Need Larger Vision Models? ➡️ 论文标题&#xff1a;When Do We Not Need Larger Vision Models? ➡️ 论文作者&#xff1a;Baifeng Shi, Ziyang Wu, Maolin Mao, Xin Wang, Trevor Darrell ➡️ 研究机构: UC Berkeley、Microsoft Research ➡️ 问题背…

【深度学习与大模型基础】第14章-分类任务与经典分类算法

Part 1&#xff1a;什么是分类任务&#xff1f; 1.1 分类就是“贴标签” 想象你有一堆水果&#xff0c;有苹果&#x1f34e;、橘子&#x1f34a;、香蕉&#x1f34c;&#xff0c;你的任务是让机器学会自动判断一个新水果属于哪一类——这就是分类&#xff08;Classification&…

LeetCode 2906 统计最大元素出现至少K次的子数组(滑动窗口)

给出一个示例&#xff1a; 输入&#xff1a;nums [1,3,2,3,3], k 2 输出&#xff1a;6 解释&#xff1a;包含元素 3 至少 2 次的子数组为&#xff1a;[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。该题也是一个比较简单的滑动窗口的题目&#xff0c;但是…

使用 Spring Boot 进行开发

✨ 使用 Spring Boot 进行开发 ✨ &#x1f4cc; 本节将深入介绍如何高效使用 Spring Boot&#xff0c;涵盖以下核心主题&#xff1a; 1️⃣ &#x1f527; 构建系统 深入了解 Spring Boot 的项目结构和依赖管理 2️⃣ ⚙️ 自动配置 探索 Spring Boot 的自动化配置机制和原…

Qt的WindowFlags窗口怎么选?

Qt.Dialog: 指示窗口是一个对话框&#xff0c;这通常会改变窗口的默认按钮布局&#xff0c;并可能影响窗口框架的样式。Qt.Popup: 指示窗口是一个弹出式窗口&#xff08;例如菜单或提示&#xff09;&#xff0c;它通常是临时的且没有任务栏按钮。Qt.Tool: 标识窗口作为一个工具…

Redis高可用架构全解析:主从复制、哨兵模式与集群实战指南

Redis高可用架构全解析&#xff1a;主从复制、哨兵模式与集群实战指南 引言 在分布式系统架构中&#xff0c;Redis作为高性能内存数据库的标杆&#xff0c;其高可用与扩展性设计始终是开发者关注的焦点。本文将深入剖析Redis的三大核心机制——主从复制、哨兵模式与集群架构&…

音视频之H.265/HEVC网络适配层

H.265/HEVC系列文章&#xff1a; 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现

一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显&#xff0c;此时由于分页导致可能匹配不到对应label文本显示&#xff0c;此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…

大内存生产环境tomcat-jvm配置实践

话不多讲&#xff0c;奉上代码&#xff0c;分享经验&#xff0c;交流提高&#xff01; 64G物理内存,8核CPU生产环境tomcat-jvm配置如下&#xff1a; JAVA_OPTS-server -XX:MaxMetaspaceSize4G -XX:ReservedCodeCacheSize2G -XX:UseG1GC -Xms48G -Xmx48G -XX:MaxGCPauseMilli…

C++函数模板基础

1 函数模板 1.1 基础介绍 函数模板是一种特殊的函数定义,它允许你创建通用的函数,这些函数可以处理多种不同的数据类型,而不需要为每种数据类型都编写一个单独的函数。 在 C++ 里,函数模板的格式包含模板声明与函数定义两部分,其基本格式如下: template <typename…

mangodb的数据库与集合命令,文档命令

MongoDB的下载安装与启动&#xff0c; 一、MongoDB下载安装 1. 官网下载 打开官网&#xff1a;https://www.mongodb.com/try/download/community选择&#xff1a; 版本&#xff08;Version&#xff09;&#xff1a;选最新版或者根据需要选旧版。平台&#xff08;OS&#xff0…

flink端到端数据一致性

这里有一个注意点&#xff0c;就是flink端的精准一次 1.barrier对齐精准和一次非对齐精准一次 对比​​ ​​维度​​​​Barrier 对齐的精准一次​​​​Barrier 非对齐的精准一次​​​​触发条件​​需等待所有输入流的 Barrier 对齐后才能触发检查点 收到第一个 Barrier …

4月29号

级别越大,字体越小. CSS样式控制: 例如把日期设为灰色字体

PHP代码-服务器下载文件页面编写

内部环境的服务资源下载页面有访问需求&#xff0c;给开发和产品人员编写一个简洁的下载页面提供资源下载。直接用nginxphp的形式去编写了&#xff0c;这里提供展示index.php文件代码如下&#xff1a; <?php // 配置常量 define(BASE_DIR, __DIR__); // 当前脚本所在目录作…

MySQL基础关键_001_认识

目 录 一、概述 1.数据库&#xff08;DB&#xff09;分类 &#xff08;1&#xff09;关系型数据库 &#xff08;2&#xff09;非关系型数据库 2.数据库管理系统&#xff08;DBMS&#xff09; 3.SQL &#xff08;1&#xff09;说明 &#xff08;2&#xff09;分类 二、…

Shell、Bash 执行方式及./ 执行对比详解

Shell、Bash 执行方式及./ 执行对比详解 在 Linux 和 UNIX 系统的使用过程中&#xff0c;Shell 脚本是实现自动化任务、系统管理的重要工具。而在执行 Shell 脚本时&#xff0c;我们常常会用到bash命令以及./的执行方式&#xff0c;这两种执行方式看似相似&#xff0c;实则存在…

P1494 [国家集训队] 小 Z 的袜子 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 q q q 次查询&#xff0c;每次查询给定 ( l , r ) (l,r) (l,r). 你需要求出 2 ∑ i ≤ i < j ≤ r [ a i a j ] ( r − l ) ( r − l 1 ) \dfrac{2\sum…