Upload 上传
通过点击或者拖拽上传文件。
基础用法
点击或拖拽上传
vue
<my-upload v-model:file-list="files" @change="handleChange" />图片墙
list-type="picture-card" 以卡片网格方式展示已上传图片。



+
vue
<my-upload v-model:file-list="files" list-type="picture-card" accept="image/*" multiple :limit="6" />用户头像
:limit="1" 限制只上传一个文件,新文件会覆盖旧文件。效果如下:



+
vue
<my-upload v-model:file-list="files" list-type="picture-card" accept="image/*" :limit="1" />图片列表缩略图
list-type="picture" 以列表方式展示,每项带缩略图。



点击或拖拽上传
vue
<my-upload v-model:file-list="files" list-type="picture" accept="image/*" multiple />自定义缩略图
通过 #thumbnail 插槽自定义缩略图显示。


点击或拖拽上传
vue
<my-upload v-model:file-list="files" list-type="picture">
<template #thumbnail="{ file }">
<div>{{ file.type.startsWith('image/') ? '🖼' : '📄' }}</div>
</template>
</my-upload>覆盖前一个文件
:limit="1" 且不设置 multiple 时,新上传的文件会替换旧文件。
点击或拖拽上传
vue
<my-upload v-model:file-list="files" :limit="1" />上传文件列表控制
show-file-list 控制是否显示文件列表,v-model:file-list 双向绑定文件列表。
点击或拖拽上传
vue
<my-upload v-model:file-list="files" :show-file-list="false" />拖拽上传
拖拽文件到上传区域即可上传,拖入时有视觉反馈。
将文件拖拽到此处
vue
<my-upload v-model:file-list="files">
<template #trigger>
<div>将文件拖拽到此处</div>
</template>
</my-upload>上传目录
directory 允许上传整个文件夹。
点击或拖拽上传
vue
<my-upload v-model:file-list="files" directory multiple />手动上传
auto-upload="false" 关闭自动上传,通过 ref 调用 submit() 手动触发。
点击或拖拽上传
vue
<my-upload ref="uploadRef" v-model:file-list="files" :auto-upload="false" />
<my-button @click="uploadRef.submit()">开始上传</my-button>限制文件类型与数量
点击或拖拽上传
仅支持 .jpg / .png / .pdf,最多3个
vue
<my-upload v-model:file-list="files" accept=".jpg,.png,.pdf" :limit="3" multiple />表单校验
配合 Form 组件校验是否已上传文件。
vue
<my-form :model="form" :rules="rules">
<my-form-item prop="files" label="附件">
<my-upload v-model:file-list="form.files" />
</my-form-item>
</my-form>组件结构
<div> 根元素包含拖拽覆盖层、触发区域(含隐藏的 <input type="file"> 和默认/插槽内容),以及按 listType 渲染的文件列表:文本列表(my-upload__list)、图片列表(my-upload__picture-list)或图片卡片墙(my-upload__card-list)。
CSS 类名
| 类名 | 说明 |
|---|---|
.my-upload | 根元素 |
.is-large | 大尺寸 |
.is-small | 小尺寸 |
.my-upload__input | 隐藏的文件输入 |
.my-upload__trigger | 触发区域 |
.is-dragging | 拖拽中状态 |
.my-upload__drag-overlay | 拖拽覆盖层 |
.my-upload__default | 默认上传区域 |
.my-upload__list | 文本文件列表 |
.my-upload__file | 文本文件项 |
.my-upload__file-name | 文件名 |
.my-upload__file-progress | 上传进度 |
.my-upload__remove | 移除按钮 |
.my-upload__picture-list | 图片列表 |
.my-upload__picture-file | 图片文件项 |
.my-upload__picture-thumb | 缩略图 |
.my-upload__picture-name | 图片文件名 |
.my-upload__picture-progress | 图片上传进度 |
.my-upload__card-list | 图片卡片列表 |
.my-upload__card | 卡片容器 |
.my-upload__card--add | 添加按钮卡片 |
.is-uploading | 上传中状态 |
.is-error | 上传错误状态 |
.my-upload__card-img | 卡片图片 |
.my-upload__card-actions | 卡片悬浮操作层 |
.my-upload__card-progress | 卡片上传进度 |
.my-upload__card-btn | 卡片操作按钮 |
.my-upload__card-plus | 添加图标 |
API
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| fileList | 文件列表 (v-model) | File[] | [] |
| accept | 接受的文件类型 | string | — |
| multiple | 是否多选 | boolean | false |
| disabled | 禁用 | boolean | false |
| limit | 最大文件数(1 时覆盖前一个) | number | — |
| autoUpload | 自动上传 | boolean | true |
| directory | 上传目录 | boolean | false |
| listType | 文件列表类型 | 'text' | 'picture' | 'picture-card' | 'text' |
| showFileList | 是否显示文件列表 | boolean | true |
| size | 上传区域尺寸 | 'large' | 'default' | 'small' | 'default' |
Events
| 事件 | 说明 | 回调 |
|---|---|---|
| update:fileList | v-model 更新 | (files: File[]) |
| change | 文件列表变更 | (files, rawFiles) |
| preview | 预览文件(图片墙点击) | (file) |
| remove | 移除文件 | (file, index) |
| exceed | 超出限制数量 | (files) |
Methods (ref)
| 方法 | 说明 |
|---|---|
| submit() | 手动上传(autoUpload: false 时) |
| clearFiles() | 清空所有文件 |
Slots
| 名称 | 说明 | 作用域 |
|---|---|---|
| trigger | 自定义上传触发区域 | — |
| thumbnail | 自定义缩略图 | { file } |