基于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: [],
  })
}}/>

转载请注明出处

相关推荐
东东2334 分钟前
前端开发中如何取消Promise操作
前端·javascript·promise
掘金安东尼10 分钟前
官方:什么是 Vite+?
前端·javascript·vue.js
柒崽11 分钟前
ios移动端浏览器,vh高度和页面实际高度不匹配的解决方案
前端
渣哥27 分钟前
你以为 Bean 只是 new 出来?Spring BeanFactory 背后的秘密让人惊讶
javascript·后端·面试
烛阴35 分钟前
为什么游戏开发者都爱 Lua?零基础快速上手指南
前端·lua
大猫会长1 小时前
tailwindcss出现could not determine executable to run
前端·tailwindcss
Moonbit1 小时前
MoonBit Pearls Vol.10:prettyprinter:使用函数组合解决结构化数据打印问题
前端·后端·程序员
533_1 小时前
[css] border 渐变
前端·css
云中雾丽1 小时前
flutter的dart语言和JavaScript的消息循环机制的异同
前端
地方地方1 小时前
Vue依赖注入:provide/inject 问题解析与最佳实践
前端·javascript·面试