基于antdesign封装一个react的上传组件

项目中遇到了一个上传的需求,看了一下已有的代码很粗糙,而且是直接引用andt的组件,体验不太好,自己使用FormData对象封装了一个上传组件,仅供参考。

代码如下:

javascript 复制代码
  /**
   * FileUploadModal
   * @description - 文件选择上传
   * @param data
   * @return {HTMLDivElement}
   * @author xxx
   */
  FileUploadModal(props) {
    console.log("props", props)
    const { success } = props
    const [fileList, setFileList] = useState(null);
    const [isModalVisible, setIsModalVisible] = useState(false);
    const showModal = () => {
      setIsModalVisible(true);
    };

    const handleFileChange = ({ file, fileList: updatedFileList }) => {
      setFileList(updatedFileList);
      if (file.status === 'done') {
        message.success(`${file.name} file uploaded successfully.`);
        // 文件上传完毕后清空文件列表
        setFileList([]);
      }
    };
    // 文件导入
    const handleUpload = () => {
      // 在这里处理文件上传逻辑
      setIsModalVisible(false);
      console.log('文件已选择:', fileList);
      const formData = new FormData()
      formData.append('file', fileList[0].originFileObj)
      // 调用批量上传接口
      service.fetchUpload
        .call(formData, true).then(
          (res) => {
            return res.json()
          }
        )
        .then((res) => {
          setFileList([])
          if (res.resCode === 0) {
            message.success(`"上传成功"`)
            success()
          } else {
            message.success(`${res.resMsg}`)
            return
          }
          res?.hideIndicator?.()
        })
        .catch((err) => {
          console.log("err", err)
          ErrorPrompt.openErrorMessage(
            JSON.parse(err.response).resMsg
          )
        })
    };
    const handleCancel = () => {
      setFileList([])
      setIsModalVisible(false);
    };

    return (
      <>
        <Button type="primary" onClick={showModal}>批量导入</Button>
        <Modal title="批量文件导入" visible={isModalVisible}
          onOk={handleUpload}
          onCancel={handleCancel}>
          <p>请选择文件进行上传</p>
          <Upload
            beforeUpload={() => false} // 禁止自动上传
            onChange={handleFileChange}
            rules={[{ required: true, message: "请上传文件" }]}
            valuePropName="fileList"
            getValueFromEvent={e=>{if(Array.isArray(e)) return e; return e && e.fileList}}
            fileList={fileList}
          >
            <Button>选择文件</Button>
          </Upload>
        </Modal>
      </>
    );
  },

使用更简单,因为把触发modal的按钮也封装在组件里了,直接引用即可:

javascript 复制代码
<FileUploadModal success={() => {   //callback function
  xxxRef.current.fetchData()
  xxxRef.current.setState({
    selectedRows: [],
    selectedRowKeys: [],
  })
}}/>

转载请注明出处

相关推荐
aa小小3 分钟前
localhost 访问异常排查笔记
前端
格子软件3 分钟前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo
陈随易22 分钟前
Rust、Golang、MoonBit 编译成 WASM,体积和速度差距有多大?
前端·后端·程序员
IT_陈寒25 分钟前
Python多线程的坑,我居然现在才踩到
前端·人工智能·后端
摇滚侠31 分钟前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
触底反弹1 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹1 小时前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
竹林8182 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记2 小时前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
优雅格子衫2 小时前
TypeScript 类的基本使用小结
javascript·ubuntu·typescript