FxUpload 文件上传
通过点击或拖拽上传文件。不依赖任何 UI 框架。
FxUpload 属于 @fx/components。
基础用法
使用 slot 自定义上传按钮的类型与文字。设置 limit 和 on-exceed 限制最大上传数量并定义超限时的处理方式。还可在 before-remove 钩子中中止移除。
覆盖前一个文件
设置 limit 和 on-exceed,在选择新文件时自动替换前一个文件。
用户头像
使用 before-upload 钩子限制上传文件的格式与大小。
照片墙
使用 list-type 改变文件列表样式。
自定义缩略图
使用 file 作用域插槽自定义缩略图模板。
文件列表缩略图
文件列表控制
使用 on-change 钩子控制上传文件列表。
拖拽上传
把文件拖到指定区域即可上传。
目录上传
通过 directory 开启文件夹上传。开启后只能选择文件夹,选择后其中的文件会被拍平。
手动上传
局部引入
ts
import { FxUpload, FxUploadDragger } from "@fx/components"API
Attributes
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| action(必填) | 请求 URL | string | '#' |
| headers | 请求头 | Headers | Record<string, any> | — |
| method | 设置上传请求方法 | string | 'post' |
| multiple | 是否允许多文件上传 | boolean | false |
| data | 附带的表单数据,支持 Awaitable 与函数 | Record<string, any> | Awaitable<Record<string, any>> | ((rawFile: UploadRawFile) => Awaitable<Record<string, any>>) | {} |
| name | 上传文件字段名 | string | 'file' |
| with-credentials | 是否发送 cookie | boolean | false |
| show-file-list | 是否显示已上传文件列表 | boolean | true |
| drag | 是否开启拖拽上传 | boolean | false |
| accept | 接受的文件类型 | string | '' |
| crossorigin | 原生属性 crossorigin | '' | 'anonymous' | 'use-credentials' | — |
| on-preview | 点击已上传文件时的钩子 | (uploadFile: UploadFile) => void | — |
| on-remove | 文件移除时的钩子 | (uploadFile: UploadFile, uploadFiles: UploadFiles) => void | — |
| on-success | 上传成功时的钩子 | (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => void | — |
| on-error | 上传失败时的钩子 | (error: Error, uploadFile: UploadFile, uploadFiles: UploadFiles) => void | — |
| on-progress | 上传进度时的钩子 | (evt: UploadProgressEvent, uploadFile: UploadFile, uploadFiles: UploadFiles) => void | — |
| on-change | 文件状态改变时的钩子(选择 / 成功 / 失败) | (uploadFile: UploadFile, uploadFiles: UploadFiles) => void | — |
| on-exceed | 超出限制时的钩子 | (files: File[], uploadFiles: UploadUserFile[]) => void | — |
| before-upload | 上传前钩子,返回 false 或被 reject 的 Promise 将中止上传 | (rawFile: UploadRawFile) => Awaitable<void | undefined | null | boolean | File | Blob> | — |
| before-remove | 删除前钩子,返回 false 或被 reject 的 Promise 将中止删除 | (uploadFile: UploadFile, uploadFiles: UploadFiles) => Awaitable<boolean> | — |
| file-list / v-model:file-list | 默认已上传文件列表 | UploadUserFile[] | [] |
| list-type | 文件列表类型 | 'text' | 'picture' | 'picture-card' | 'text' |
| auto-upload | 是否自动上传 | boolean | true |
| http-request | 覆盖默认 xhr 行为,自定义上传请求 | (options: UploadRequestOptions) => XMLHttpRequest | Promise<unknown> | ajaxUpload |
| disabled | 是否禁用上传 | boolean | false |
| limit | 最大上传数量 | number | — |
| directory | 是否支持目录上传。开启后只能选择文件夹,选择后其中的文件会被拍平 | boolean | false |
Slots
| 名称 | 说明 | 类型 |
|---|---|---|
| default | 自定义默认内容 | — |
| trigger | 触发文件对话框的内容 | — |
| tip | 提示内容 | — |
| file | 缩略图模板内容 | { file: UploadFile, index: number } |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| abort | 取消上传请求。指定 file 则取消对应挂起上传;未指定则取消所有 | (file?: UploadFile) => void |
| submit | 手动上传文件列表 | () => void |
| clearFiles | 清空文件列表(此方法在 before-upload 钩子中不支持) | (status?: UploadStatus[]) => void |
| handleStart | 手动选择文件 | (rawFile: UploadRawFile) => void |
| handleRemove | 手动移除文件。file 与 rawFile 已合并 | (file: UploadFile | UploadRawFile, rawFile?: UploadRawFile) => void |
类型声明
展开声明
ts
type UploadFiles = UploadFile[]
type UploadUserFile = Omit<UploadFile, "status" | "uid"> &
Partial<Pick<UploadFile, "status" | "uid">>
type UploadStatus = "ready" | "uploading" | "success" | "fail"
type Awaitable<T> = Promise<T> | T
interface UploadFile {
name: string
percentage?: number
status: UploadStatus
size?: number
response?: unknown
uid: number
url?: string
raw?: UploadRawFile
}
interface UploadProgressEvent extends ProgressEvent {
percent: number
}
interface UploadRawFile extends File {
uid: number
isDirectory?: boolean
}
interface UploadRequestOptions {
action: string
method: string
data: Record<string, string | Blob | [string | Blob, string] | string[]>
filename: string
file: UploadRawFile
headers: Headers | Record<string, string | number | null | undefined>
onError: (evt: UploadAjaxError) => void
onProgress: (evt: UploadProgressEvent) => void
onSuccess: (response: any) => void
withCredentials: boolean
}实现说明
- 4 件套结构:
FxUpload组装upload-content(触发器 +<input type="file">)与upload-list(文件列表),FxUploadDragger提供拖拽容器;use-handlers管理文件状态机与v-model:file-list双向绑定。 - 类名由
useNamespace('upload' / 'icon' / 'list')生成;样式走@fx/stylestoken(--color-*/--duration-*)。 - 图标使用
FxIcon(@fx-core/icon),图标名ep:document/ep:check/ep:circle-check/ep:close/ep:delete/ep:zoom-in/ep:upload-filled等;图标颜色由 scss 按状态/位置控制,故 FxIcon 传color=""禁用内联色、size仍用 prop。 - 进度条使用
FxProgress;上传请求默认基于XMLHttpRequest + FormData,可通过http-request覆盖。 before-upload返回false/ reject / 返回新File/Blob可中止或替换上传文件。
