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

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

  /**
   * 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的按钮也封装在组件里了,直接引用即可:

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

转载请注明出处

相关推荐

  1. 基于antdesign封装一个react组件

    2024-07-10 09:24:02       36 阅读
  2. React+umi+antdesign实现文件组件(阿里云)

    2024-07-10 09:24:02       51 阅读
  3. element-ui图片组件封装

    2024-07-10 09:24:02       41 阅读
  4. antd react 组件 customRequest 讲解

    2024-07-10 09:24:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 09:24:02       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 09:24:02       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 09:24:02       90 阅读
  4. Python语言-面向对象

    2024-07-10 09:24:02       98 阅读

热门阅读

  1. Leetcode100.判断两颗二叉树是否相同

    2024-07-10 09:24:02       27 阅读
  2. 防止应用调试分析IP被扫描加固实战教程

    2024-07-10 09:24:02       32 阅读
  3. Js- Math对象

    2024-07-10 09:24:02       26 阅读
  4. 基于Unity3D的Rokid AR Glass项目开发实战教程

    2024-07-10 09:24:02       32 阅读
  5. 每日一道算法题 求最小公倍数

    2024-07-10 09:24:02       93 阅读
  6. pycharm插件的安装

    2024-07-10 09:24:02       31 阅读
  7. 配置管理新纪元:Eureka引领分布式服务配置潮流

    2024-07-10 09:24:02       27 阅读
  8. cpp http server/client

    2024-07-10 09:24:02       30 阅读
  9. Html利用Vue动态加载单文件页面【httpVueLoader】

    2024-07-10 09:24:02       31 阅读
  10. linux:命令执行过程【图表】

    2024-07-10 09:24:02       26 阅读