JGuang

图片上传 <Experimental></Experimental>

ImageUploader <Experimental></Experimental> · Ant Design Mobile

交互预览
npm install antd-mobile@5.43.0

图片上传 <Experimental></Experimental> ImageUploader <Experimental></Experimental>

示例

安装

npm install antd-mobile@5.43.0

antd-mobile 是移动网页组件库,不是 React Native 或小程序组件。React 19 项目需在入口用 unstableSetRender 注册 createRoot,否则 Toast、Dialog 等命令式 API 无法渲染;深色模式通过 <html data-prefers-color-scheme="dark"> 切换。

示例来自 Ant Design Mobile 官方仓库(MIT),固定在 npm 5.43.0 对应的提交;示例中的 DemoBlock 等展示辅助组件由 JGuang 重写,不属于 antd-mobile 的 API。

示例

ImageUploader

属性

属性说明类型默认值
accept文件类型,image/gif image/jpeg image/jpg image/pngstringimage/*
beforeUpload文件读取前的回调函数,返回 null 可终止文件读取,支持返回 Promise(file: File, files: File[]) => Promise<File | null> | File | null-
capture图片选取模式,可选值为 camera(直接调起摄像头)boolean | string-
children自定义上传按钮ReactNode-
columns列数number-
defaultValue默认已上传的文件列表ImageUploadItem[]-
deletable是否展示删除按钮booleantrue
deleteIcon删除按钮的 icon 图标ReactNode<CloseOutline />
disableUpload是否禁用上传按钮booleanfalse
imageFit图片填充模式,同 Image'contain' | 'cover' | 'fill' | 'none' | 'scale-down'cover
maxCount最多上传几张图片,超出数量会自动隐藏上传按钮,0 表示不做限制number0
multiple是否支持选择多张图片booleanfalse
onChange已上传的文件列表变化时触发(items: ImageUploadItem[]) => void-
onCountExceed用户选择的图片数量超出最大限制时触发(exceed: number) => void-
onDelete删除已上传成功的图片时触发,如果返回 false 表示阻止删除,支持返回 Promise(item: ImageUploadItem) => boolean | Promise<boolean> | void-
onPreview点击预览图片(index: number, item: ImageUploadItem) => void-
preview是否支持预览booleantrue
showFailed是否展示上传失败状态下的图片booleantrue
showUpload是否展示上传按钮booleantrue
upload上传方法,入参是需要被上传的文件对象,经过异步处理之后,返回上传结果(file: File) => Promise<ImageUploadItem>-
value已上传的文件列表ImageUploadItem[]-
onUploadQueueChange图片上传队列变化时触发(tasks: UploadTask[]) => void-
renderItem自定义上传列表项(originNode: React.ReactElement, file: ImageUploadItem, fileList: ImageUploadItem[] ) => React.ReactNode-

Ref

属性说明类型版本
nativeElement原生输入框节点HTMLInputElement | null5.33.0

ImageUploadItem

属性说明类型默认值
extra附带一些额外信息,可以业务中自己随意定义any-
key唯一标识string | number数组下标
thumbnailUrl缩略图的资源地址stringurl
url图片的资源地址string-

UploadTask

属性说明类型默认值
id上传图片 idnumber-
status图片上传状态'pending' | 'fail' | 'success'-

CSS 变量

属性说明默认值
--cell-size图片和上传按钮的大小(仅在非 columns 模式下有效)80px
--gap间距大小12px
--gap-horizontal水平方向的间距大小var(--gap)
--gap-vertical垂直方向的间距大小var(--gap)

FAQ

配置了 capture 属性,为什么部分安卓机型还是会带上文件选项?

ImageUploader 所提供的 capture 是来自 HTML 原生的能力,而在部分操作系统/浏览器环境下,可能并不支持该属性,因此这个问题无法避免。

详见此 issue 中的讨论。

columns 属性说明

columns 属性依赖 Grid 布局,该属性存在时,不支持自定义 --cell-size 属性,因为图片和上传按钮的大小是自动计算的。

如何在 App 中使用客户端提供的上传能力?

可以通过 disableUpload 禁用原生上传,然后自定义上传按钮。

const App = () => {
  const [fileList, setFileList] = useState([])

  const handleUpload = async () => {
    // 调用app上传
    const url = await hybrid.upload()
    setFileList(fileList => [...fileList, { url }])
  }

  return (
    <ImageUploader
      value={fileList}
      onChange={setFileList}
      disableUpload
    >
      <span
        className='adm-image-uploader-cell adm-image-uploader-upload-button'
        onClick={handleUpload}
      >
        <span className='adm-image-uploader-upload-button-icon'>
          <AddOutline />
        </span>
      </span>
    </ImageUploader>
  )
}