FileDrop 文件拖放
让用户把文件拖进来或点击选择。组件只负责收文件并按类型、大小筛选,不负责上传;已选文件的列表和上传进度请自己展示。
基本用法
背后是一个铺满整块的真 input[type=file]:点击、或 Tab 聚焦后按空格 / Enter,都由浏览器打开文件选择框。拖着文件经过时整块高亮。
筛选、列表与错误
accept 支持扩展名、MIME 和 image/* 这类通配;maxSize 是单个文件的字节上限。通过的文件进 onChange,被挡下的进 onReject。组件是非受控的:每次选择只回传这一次的文件,累加和去重由你决定。
PNG / JPG / PDF,单个不超过 2 MB
文案与状态
API
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
onChange | (files: File[]) => void | — | 选了或拖入了文件:参数是通过筛选的文件。没开 multiple 时最多一个。 |
onReject | (files: File[]) => void | — | 被 accept / maxSize 挡下的文件。 |
accept | string | — | 允许的类型,逗号分隔:.pdf、image/png、image/*。拖入的文件也按它筛选。 |
multiple | boolean | — | 允许一次选多个。 |
maxSize | number | — | 单个文件的大小上限(字节)。 |
title | ReactNode | '把文件拖到这里,或点击选择' | 主文案。 |
hint | ReactNode | — | 副文案(格式、大小限制等)。 |
icon | ReactNode | — | 自定义图标,默认是上传图标。 |
invalid | boolean | — | 校验失败。在 Field 里默认跟随 Field。 |
disabled | boolean | — | 禁用:不能点击,也不接收拖入。 |
children | ReactNode | — | 追加在文案下面的内容。 |
rootClassName / rootStyle | string / CSSProperties | — | 外层 <label> 的类名与样式。className / style 同样落在 <label> 上。 |
…rest | InputHTMLAttributes | — | 其余原生属性(name、required、capture…)和 ref 落在 <input type="file"> 上。 |
无障碍
- 真正可聚焦的是原生
<input type="file">,外层是包着它的<label>,所以主文案和副文案就是它的可读名称。 - Tab 聚焦,Space / Enter 打开系统的文件选择框。拖放只是鼠标用户的捷径,键盘始终可用。
- 选完后组件里有一行 aria-live 文字播报结果(“已选择 a.png”“2 个文件不符合要求”)。
- 被拒绝的原因请写进 Field 的 error,说清楚是哪个文件、为什么。
- 没有可见标题时请给
aria-label。