当前位置: 首页 > news >正文

基于ant的图片上传组件封装(复制即可使用)

/*** 上传图片组件* @param imgSize 图片大小限制* @param data 上传数据* @param disabled 是否禁用*/import React, { useState,useEffect } from 'react';
import { Upload, Icon, message} from 'antd';
const UploadImage = ({imgSize = 50,data = { Directory: 'Image' },disabled = false,onChange,value
}) => {const [loading, setLoading] = useState(false);const [fileList, setFileList] = useState([]);useEffect(()=>{setImg();},[value])const beforeUpload = (file) => {const isImage = file.type.startsWith('image/');if (!isImage) {message.error('只能上传图片文件!');return false;}const isLt4M = file.size / 1024 < imgSize;if (!isLt4M) {message.error(`图片大小不能超过${imgSize}KB!`);onChange('')}return isLt4M;};const uploadConfig = {action: `${configs.host.test}/api/FileUpload/Upload`,listType: 'picture-card',onChange(info) {setFileList(info.fileList);if (info.file.status === 'uploading') {setLoading(true);return;}if (info.file.status === 'done') {if (info.file.response.code === '0') {message.success(`${info.file.name} 上传完成`);onChange(info.file.response.data)} else {onChange('')message.error(`${info.file.name} 上传失败`);}}},onRemove() {setLoading(false);onChange('')},};const setImg = () => {if(value){setFileList([{uid: 1,name: 'xxx.jpg',status: 'done',url: value,},]);}else{setFileList([]);}};return (<Upload{...uploadConfig}name="filename"data={{ ...data, merchantId: localStorage.getItem('MerchantId') }}defaultFileList={fileList}fileList={fileList}beforeUpload={beforeUpload}disabled={disabled}>{fileList.length > 0 ? null : (<div><Icon type={loading ? 'loading' : 'plus'} /><div className="ant-upload-text">上传</div></div>)}</Upload>);
};export default UploadImage;
 {/* 上传组件 ---开始 */}<FormItem{...formItemLayout2}label="上传组件"extra="图片建议尺寸:606像素*202像素,大小不超过2M。">{getFieldDecorator("brandLogo", {rules: [{ required: true, message: "请上传图片" }],initialValue: detailData.brandLogo,})(<UploadImage imgSize={10000} />)}</FormItem>{/* 上传组件 ---结束 */}
  1. 将上传组件和Form绑定在一起

    1. 不需要在提交的时候额外判断 XXX图片是否存在

    2. 删除图片时会主动触发表单当前图片的验证,提示用户,表现形式和其他表单项一致

相关文章:

  • 2个wordpress优化SEO主题模板
  • TypeScript基础知识点
  • 捕捉消费新趋势,脉纷纷让生活更便捷
  • 学习鸿蒙基础(4)
  • python加载模块
  • 【工具类】开源照片管理工具pthtoprism
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • 【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器
  • 【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理
  • 可变形注意力(Deformable Attention)及其拓展
  • 【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解
  • this的指向问题总结
  • 【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分]
  • 常见锁策略,CAS,synchrodized原理讲解
  • 企业微信机器人的运营策略与实践
  • 【mysql】环境安装、服务启动、密码设置
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Invalidate和postInvalidate的区别
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jdbc就是这么简单
  • nodejs实现webservice问题总结
  • PAT A1120
  • PHP 的 SAPI 是个什么东西
  • 猴子数据域名防封接口降低小说被封的风险
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 手写双向链表LinkedList的几个常用功能
  • 跳前端坑前,先看看这个!!
  • 新书推荐|Windows黑客编程技术详解
  • MyCAT水平分库
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • #100天计划# 2013年9月29日
  • #if和#ifdef区别
  • #图像处理
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)bark-ml
  • (5)STL算法之复制
  • (done) 两个矩阵 “相似” 是什么意思?
  • (二)WCF的Binding模型
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (三)终结任务
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core 项目指定SDK版本
  • .net framework4与其client profile版本的区别
  • .Net IOC框架入门之一 Unity
  • .NET/C# 使用反射注册事件
  • [1181]linux两台服务器之间传输文件和文件夹
  • [C#] 我的log4net使用手册
  • [C语言]编译和链接
  • [go 反射] 进阶
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • [jobdu]不用加减乘除做加法