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

javascript 复制代码
/**
 * 上传图片组件
 * @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;
javascript 复制代码
 {/* 上传组件 ---开始 */}
                <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. 删除图片时会主动触发表单当前图片的验证,提示用户,表现形式和其他表单项一致

相关推荐
@大迁世界6 小时前
Firefox 本地模式:localhost 再见了 ?
前端·架构
米米商聊8 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome8889 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌9 小时前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易9 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常10 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
计算机魔术师10 小时前
谷歌搜索广告踩刹车,AI广告成为救命稻草
前端
总要学点什么11 小时前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
IT_陈寒11 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
hunter_07611 小时前
一次 iOS 真机签名 409 的完整排查:证书、设备、描述文件为什么总是"对不上"
前端