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

相关推荐
辻戋2 小时前
从零实现React Scheduler调度器
前端·react.js·前端框架
徐同保2 小时前
使用yarn@4.6.0装包,项目是react+vite搭建的,项目无法启动,报错:
前端·react.js·前端框架
Qrun3 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
中国lanwp3 小时前
全局 npm config 与多环境配置
前端·npm·node.js
JELEE.4 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
TeleostNaCl6 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫7 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友7 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理9 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻9 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js