【AntDesign】文件自定义上传组件

技术栈

AntDesign 版本 : 3x

效果图如下
官网示例给的是标准上传模式, 此处用的是自定义上传模式(customRequest)
在这里插入图片描述

ps : 此处是文件上传, 和图片上传实际共用的都是antd Upload组件, 图片上传组件传送门 : https://blog.csdn.net/qq_45481971/article/details/130576408?spm=1001.2014.3001.5501
( 代码大致相同, 代码详解这里就不写了, 可以参考图片上传组件详解~ )

代码

子组件代码 ↓

import React, { useState, useImperativeHandle } from 'react'
import { Button, Upload, Icon, message } from 'antd'
import PropTypes from 'prop-types'
import { uploadFunc, uploadSmallFunc } from '../../common/uploadFunc'

const UploadCom = (props, ref) => {
  const { dataList, disabled, acceptType, type, handleMediaResource } = props
  const [fileList, setFileList] = useState(dataList)
  useImperativeHandle(ref, () => ({ clearUploadList }))
  const clearUploadList = () => {
    setFileList([])
  }
  // 自定义上传逻辑
  const customRequest = async options => {
    const { file } = options
    let suffixs = []
    let usage = ''
    suffixs = ['pdf']
    usage = 'pdf'

      uploadSmallFunc(file, suffixs, usage)
        .then(res => {
          console.log(res, '上传成功返回的数据2')
          const newFileList = [
            ...fileList,
            {
              uid: file.uid,
              name: file.name,
              status: 'done',
              url: res.path,
              lastModified: file.lastModified,
              lastModifiedDate: file.lastModifiedDate,
              originFileObj: file,
              percent: 100,
              type: file.type,
            },
          ]
          setFileList(newFileList)

          if (newFileList.length > 0) {
            handleMediaResource({ type, fileList: newFileList })
          }
        })
        .catch(err => {
          const newFileList = [
            ...fileList,
            {
              uid: file.uid,
              name: file.name,
              status: 'error',
              url: file.path,
              lastModified: file.lastModified,
              lastModifiedDate: file.lastModifiedDate,
              originFileObj: file,
              percent: 100,
              type: file.type,
            },
          ]
          setFileList(newFileList)
        }) 
  }

  const showUploadList = { showRemoveIcon: disabled ? false : true }

  const props2 = {
    accept: acceptType,
    onChange(info) {
      if (info.file.status !== 'uploading') {
        console.log(info.file, info.fileList)
      }
      if (info.file.status === 'done') {
        message.success(`${info.file.name} 上传成功`)
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} 上传失败`)
      }
    },
    onRemove: file => {
      const index = fileList.indexOf(file)
      const newFileList = fileList.slice()
      newFileList.splice(index, 1)
      handleMediaResource({ type, fileList: newFileList })
      setFileList(newFileList)
    },
    defaultFileList: [],
    beforeUpload: file => {
      // 限制文件大小 小于20m
      const isFile20M = file.size / 1024 / 1024 > 20
      if (isFile20M) {
        message.error('文件大小超出20M限制,请修改后重新上传')
        return false
      }
    },
  }

  return (
    <div>
      <Upload
        {...props2}
        showUploadList={showUploadList}
        fileList={fileList}
        customRequest={customRequest}
      >
        <Button size="large" style={{ width: '150px' }} disabled={disabled}>
          <Icon style={{ fontSize: '18px' }} type="upload" />
          点击上传
        </Button>
      </Upload>
    </div>
  )
}
export default React.forwardRef(UploadCom)

父组件(部分)代码 ↓

  // 通过ref向子组件传递事件
  const uploadComRef= React.createRef(null)

  // 提交时清除图片组件数据
  const onSubmitFn = e => {
  	uploadComRef.current.clearUploadList()
  }
  
  // 上传组件
	<UploadCom
	   ref={uploadComRef}
       type="resourcePdf"
       acceptType=".pdf"
       dataList={pdfDataList}
       disabled={editType == 'view' ? true : false}
       handleMediaResource={handleMediaResource}
    />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design Pro 中,可以通过使用 Upload 组件来实现文件上传的功能。如果需要自定义上传并且需要回调函数,则可以在 Upload 组件中使用 `customRequest` 属性来自定义上传行为,并且可以在这个函数中进行上传成功或失败的回调。 下面是一个示例代码: ```jsx import { Upload, message } from 'antd'; function handleUpload(options) { const { onSuccess, onError, file } = options; // 这里可以自定义上传行为,例如使用 axios 发送请求 // 如果上传成功,调用 onSuccess 回调函数,并传入返回的数据 // 如果上传失败,调用 onError 回调函数,并传入错误信息 if (上传成功) { onSuccess(返回的数据); } else { onError(错误信息); } } function MyUploadComponent() { return ( <Upload customRequest={handleUpload} onChange={(info) => { if (info.file.status !== 'uploading') { console.log(info.file, info.fileList); } if (info.file.status === 'done') { message.success(`${info.file.name} 上传成功`); } else if (info.file.status === 'error') { message.error(`${info.file.name} 上传失败`); } }} > {/* 这里可以添加上传按钮 */} </Upload> ); } ``` 在上面的代码中,我们定义了一个名为 `handleUpload` 的函数来自定义上传行为。在这个函数中,我们可以使用自己的上传逻辑,并根据上传结果调用 `onSuccess` 或 `onError` 回调函数。在 `MyUploadComponent` 组件中,我们将 `handleUpload` 函数赋值给了 `customRequest` 属性,这样就可以使用自定义上传行为了。同时,我们还在 `onChange` 事件中添加了处理函数,用来处理上传结果并显示提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值