Ant Design Vue上传多个图片

模板代码:

在这里插入图片描述

定义变量:

在这里插入图片描述

文件限制的函数:

在这里插入图片描述

上传的函数:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e0c18855525e450ab73b10e98fbd3103.pn

样式函数:

在这里插入图片描述

完整代码:

<template><div class="dialog-upload" v-if="showUploadDialog"><div class="dialog-upload__head"><div class="title">上传图片</div><div class="close" @click="closeDialog"></div></div><div class="dialog-upload__body"><div class="upload-box"><span class="text">tab:</span><div class="pic-box"><div v-for="(item,index) in cqImgUrl" :key="index" class="pic-box__single"><a-image class="pic" :src="item" /><div @click="deleteImg('tab',item)" class="pic-delete"></div></div><a-uploadaction="#":multiple="true"list-type="picture":before-upload="beforeUpload":customRequest="handleChange":show-upload-list="false"><div v-if="!cqImgUrl.length || cqImgUrl.length <5" class="img" @click="uploadImg('tab')"></div></a-upload></div></div><div class="upload-box"><span class="text">tab1:</span><div class="pic-box"><div v-for="(item,index) in nyImgUrl" :key="index" class="pic-box__single"><a-image class="pic" :src="item" /><div @click="deleteImg('tab1',item)" class="pic-delete"></div></div><a-uploadaction="#":multiple="true"list-type="picture":before-upload="beforeUpload":customRequest="handleChange":show-upload-list="false"><div v-if="!nyImgUrl.length || nyImgUrl.length <5" class="img" @click="uploadImg('tab1')"></div></a-upload></div></div></div><div class="dialog-upload__foot"><span class="sure" @click="sure">确定</span><span class="cancle" @click="closeDialog">取消</span></div></div>
</template><script lang="ts">
import { defineComponent, reactive, toRefs, watch, nextTick } from 'vue'
import { message } from 'ant-design-vue'
import G from '@/request/G'
import axios from 'axios'export default defineComponent({name: 'SmartDialog',props: {showUploadDialog: {// 是否显示当前弹窗type: Boolean,default: false},activeTab: {type: String,default: 'tab'},imgUrl: {type: Array,default: () => {return []}},qyStoreId: { // 拿到的机构Idtype: String,default: ''}},setup (props, { emit }) {interface FileItem {uid: string;name?: string;status?: string;response?: string;url?: string;percent?:number;type?:string;}interface FileInfo {file: FileItem;fileList: FileItem[];}const data = reactive({dialogVisible: false, // 是否显示弹窗cqImgUrl: [] as Array<string> | any,nyImgUrl: [] as Array<string> | any,cqImgList: [] as any,nyImgList: [] as any,uploadType: '', // 当前上传文件的归属limitError: false})// 监听当前的弹窗是否显示watch(() => props.showUploadDialog,(val: boolean) => {data.dialogVisible = !!val},{immediate: true,deep: true})watch(() => props.activeTab,(val: string) => {const type = val === 'tab' ? 2 : 1if (props.qyStoreId) {nextTick(() => {getPicUrl(type)})}},{immediate: true,deep: true})// 文件上传const handleChange = (info: FileInfo) => {console.log('data.limitError',data.limitError)if (!data.limitError) {const formData = new FormData()formData.append('file', info.file as any) // 添加文件对象let params = {biz: 'energy',_api: 'el.image.upload',_v: '1.0'} as anyparams = G.buildInputs(params)params._at = G.buildAt(params)Object.keys(params).forEach(key => {formData.append(key, params[key])})axios.post('/upload', formData).then((res: any) => {if (res.data && res.data.success && res.data.model) {if (res.data.model[0]) {let url = res.data.model[0].authUrlif (data.uploadType === 'tab') {data.cqImgUrl.push(url)data.cqImgList = []}if (data.uploadType === 'tab1') {data.nyImgUrl.push(url)data.nyImgList = []}}} else {message.error(res.data.msgInfo)}})}}// 获取另一个tab的图,用于回显const getPicUrl = (val:number) => {let params = {_api: 'el.energy.storeDraw',storeId: props.qyStoreId,drawType: val,_v: '1.0'} as anyparams = G.buildInputs(params)G.baseAjax({type: 'POST',data: G.param(params) + '&_at=' + G.buildAt(params)}).then((res:any) => {const { success, model } = resif (success) {if (props.activeTab === 'tab') {data.nyImgUrl = model.split(',')}if (props.activeTab === 'tab1') {data.cqImgUrl = model.split(',')}}}).finally(() => {if (props.activeTab === 'tab') {data.cqImgUrl = JSON.parse(JSON.stringify(props.imgUrl))} else if (props.activeTab === 'tab1') {data.nyImgUrl = JSON.parse(JSON.stringify(props.imgUrl))}})}// 关闭弹窗const closeDialog = () => {emit('closeDialog', false)}// 当前上传的是哪个文件const uploadImg = (type:string) => {data.uploadType = type}const deleteImg = (type:string, item:string) => {if (type === 'tab') {if (data.cqImgUrl && data.cqImgUrl.length) {let index = data.cqImgUrl.indexOf(item)data.cqImgUrl.splice(index,1)}}if (type === 'tab1') {if (data.nyImgUrl && data.nyImgUrl.length) {let index = data.nyImgUrl.indexOf(item)data.nyImgUrl.splice(index,1)}}}const beforeUpload = (file: FileItem) => {// const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg'// if (!isJpgOrPng) {//   message.error('请上传正确的图片格式!')// }if (data.uploadType === 'tab') {data.cqImgList.push(file)data.limitError = (data.cqImgList.concat(...data.cqImgUrl)).length > 5// console.log('data.cqImgList',data.cqImgList)// console.log('data.cqImgUrl',data.cqImgUrl)}if (data.uploadType === 'tab1') {data.nyImgList.push(file)data.limitError = (data.nyImgList.concat(...data.nyImgUrl)).length > 5// console.log('data.nyImgList',data.nyImgList)// console.log('data.nyImgUrl',data.nyImgUrl)}console.log('data.limitError',data.limitError)if (data.limitError) {if (data.uploadType === 'tab') {data.cqImgList = []}if (data.uploadType === 'tab1') {data.nyImgList = []}message.error('厂区图和能源图至多上传五张图片!')}return !data.limitError}const sure = () => {let params = {_api: 'el.energy.addImage',storeId: props.qyStoreId,factoryDraw: data.cqImgUrl.join(','),energyDraw: data.nyImgUrl.join(','),_v: '1.0'} as anyparams = G.buildInputs(params)G.baseAjax({type: 'POST',data: G.param(params) + '&_at=' + G.buildAt(params)}).then((res:any) => {const { success } = resif (success) {message.success('上传成功!')} else {message.error(res.msgInfo)}}).finally(() => {emit('submitDialog', {cqImgUrl: data.cqImgUrl,nyImgUrl: data.nyImgUrl})})}return {...toRefs(data),closeDialog,uploadImg,sure,handleChange,beforeUpload,deleteImg}}
})
</script><style lang="scss" scoped>
.dialog-upload {width: 1056px;height: 947px;// height: 788px;z-index: 200;position: absolute;top: 20%;left: 40%;background: url("@/assets/images/uploadDialog.png") no-repeat;background-size: 100% 100%;overflow: auto;&::-webkit-scrollbar {display: none;}&__head {position: relative;.title {padding: 32px 0 77px 48px;font-size: 44px;font-weight: 600;color: #ffffff;line-height: 62px;}.close {position: absolute;top: 24px;right: 24px;cursor: pointer;width: 32px;height: 32px;background: url("@/assets/images/close.png") no-repeat;background-size: 32px auto;}}&__body {display: flex;flex-direction: column;.upload-box {display: flex;margin-bottom: 32px;.text {display: inline-block;white-space: nowrap;width: 236px;flex: 1;font-size: 28px;font-weight: 400;color: #fff;text-align: right;}.img {cursor: pointer;width: 200px;height: 122px;background: url("@/assets/images/upload.png") no-repeat;background-size: 200px auto;}}.pic-box {display: flex;flex-wrap: wrap;flex: 3;&__single {position: relative;width: 200px;height: 122px;border: 2px dashed #4E93F8;border-radius: 8px;margin: 0 20px 24px 0;.pic  {width: 200px;height: 122px;object-fit: contain;border-radius: 8px;}.pic-delete {cursor: pointer;z-index: 200;position: absolute;z-index: 50;top: -16px;right: -12px;width: 30px;height: 30px;background: url("@/assets/images/deleteImg.png") no-repeat;background-size: 30px auto;}}}}&__foot {position: absolute;bottom: 40px;left: 50%;transform: translateX(-50%);.sure {cursor: pointer;display: inline-block;background: #3196FA;border: 2px solid #3196FA;border-radius: 8px;padding: 12px 41px;margin-right: 44px;font-size: 28px;color: #fff;}.cancle {cursor: pointer;display: inline-block;border: 2px solid #FFFFFF;border-radius: 8px;padding: 12px 41px;font-size: 28px;color: #fff;}}
}
</style>
<style lang="scss">
.dialog-upload {.ant-image {width: 196px;height: 118px;border-radius: 8px;}.ant-image-img {width: 196px;height: 118px;object-fit: contain;border-radius: 8px;}.ant-image-mask-info {// 将div下的所有元素隐藏文字大小为0visibility: hidden;font-size: 0; }.ant-image-mask-info span{// 再单独给span标签添加样式 让其显示并且给出文字大小visibility: visible;font-size: 48px;}
}
</style>

最终效果:

在这里插入图片描述

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

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

相关文章

npm pnpm yarn 报错或常见问题处理集锦

各种卡死&#xff0c;报错问题处理汇总 1. npm 安装 卡死了怎么办&#xff0c;npm # 切换源 npm config set registry https://registry.npmmirror.com # 查看源 npm config get registry2. pnpm安装 卡死了怎么办 方法1&#xff1a;切换源 npx pnpm config set registry h…

京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

1 前言 在《ElasticSearch降本增效常见的方法》一文中曾提到过zstd压缩算法[1]&#xff0c;一步一个脚印我们终于在京东ES上线支持了zstd&#xff1b;我觉得促使目标完成主要以下几点原因&#xff1a; Elastic官方原因&#xff1a;zstd压缩算法没有在Elastic官方的开发计划中&…

vue项目执行依赖安装(npm i或npm install )报ls-remote -h -t异常

从git拉取的vue项目执行依赖安装时一直报错&#xff0c; 报错如下图&#xff1a;首先&#xff0c;查看了node版本、npm配置的镜像地址均没找到解决办法。 在命令行中直接输入git发现提示于是从网上搜到了一个博文https://blog.csdn.net/weixin_49159364/article/details/118198…

【数据恢复篇】WinHex数据擦除功能

【数据恢复篇】WinHex数据擦除功能 简单写下WinHex数据擦除功能—【蘇小沐】 目录 1、实验环境 &#xff08;一&#xff09;WinHex文件"安全擦除"功能 1、安全擦除路径 2、数值填充 3、随机字符 4、模拟加密数据 &#xff08;二&#xff09;数据删除标准 1、DoD 5…

class_10:this关键字

this关键字是指向调用对象的指针 #include <iostream> #include <iostream> using namespace std;class Car{ public://成员数据string brand; //品牌int year; //年限//构造函数名与类名相同Car(string brand,int year){cout<<"构造函数中&#…

离散数学学习要点——命题逻辑

文章目录 数理逻辑命题逻辑命题命题的种类命题的表示 逻辑连接词否定联结词合取联结词∧析取联结词∨或异或 条件➡等价&#xff08;双条件&#xff09;联结词↔联结词真值表 命题逻辑中的命题的符号化命题公式及其真值表命题公式真值表 命题公式的等价重言式与重言蕴含式重言式…

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

Elasticsearch 数据类型相关总结:快速参考指南【记录】

在Elasticsearch中&#xff0c;有多种数据类型可用于定义字段。 在开始了解数据类型之前&#xff0c;首先要知道&#xff0c;在Elasticsearch中&#xff0c;分词处理主要针对文本字段&#xff0c;而对于其他类型字段&#xff08;如数值、日期、布尔等&#xff09;&#xff0c;通…

2017年认证杯SPSSPRO杯数学建模A题(第一阶段)安全的后视镜全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 A题 安全的后视镜 原题再现&#xff1a; 汽车后视镜的视野对行车安全非常重要。一般来说&#xff0c;汽车的后视镜需要有良好的视野范围&#xff0c;以便驾驶员能够全面地了解车后方的道路情况。同时&#xff0c;后视镜也要使图像的畸变尽可能…

MybatisPlus框架入门级理解

MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a; 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter&#xff0c;其中集成了Mybatis和MybatisPlus的所有功能&#…

第一部分 概述

目录 一、计算机网络在信息时代的作用 大众熟悉的三大类网络有 Internet 互连网与互联网的区别 可以从两种不同的方面来认识互联网&#xff1a; 互联网在生活中的地位 互联网 互联网负面影响 二、互联网的概述 网络的网络 基本概念 互连网基础结构发展的三个阶段 万维网www(…

java基础:求数组的最值

方法一&#xff1a;顺序查找 先假设数组第一个元素为最值&#xff0c;然后和数组里的数按顺序进行比较得出最值&#xff0c;所以叫顺序查找。 代码如下 package idea;public class arr_int {public static void main(String[] args) { // 初始化一个数组int[] arr {12…