基于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. 删除图片时会主动触发表单当前图片的验证,提示用户,表现形式和其他表单项一致

相关推荐
pe7er4 小时前
window管理开发环境篇 - 持续更新
前端·后端
We་ct5 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
陈随易9 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
冰暮流星9 小时前
javascript之事件代理/事件委托
前端
陈随易10 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
里欧跑得慢12 小时前
17. Flutter Hero动画实现:让界面过渡更加优雅
前端·css·flutter·web
IT_陈寒13 小时前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
cn_mengbei13 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen13 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
去伪存真13 小时前
我自己写的第一个skills--project-core-standards
前端·agent