Vue 3组合式函数封装文件上传需统一管理任务状态、进度、取消与异常:用ref存单值、reactive存结构化进度数据,为每文件生成唯一ID,绑定Axios onUploadProgress监听,集成AbortController支持取消,暴露startUpload、getProgress等清晰API。

Vue 3 组合式函数封装文件上传进度与状态,核心是把“谁在传、传到哪、是否成功、能否中断”这四件事收拢到一个可复用、响应式、带生命周期管理的逻辑单元里。不是写个 onProgress 回调就完事,而是建立任务级的状态映射和统一调度机制。
用 ref + reactive 管理多维度状态
单个上传任务需要跟踪至少五类信息:文件元数据、当前进度(loaded/total)、百分比、上传速度、状态(pending/uploading/success/error/canceled)。建议用以下结构组织:
- 用 ref 存单值状态,如
isUploading、error - 用 reactive 存结构化数据,如
progress: { percent: 0, loaded: 0, total: 0, speed: 0 } - 为每个文件生成唯一 ID(
Symbol()或crypto.randomUUID()),避免多文件时状态混淆 - 若支持并发上传,用 Map 或 ref
> 存所有任务进度,key 即任务 ID
进度监听必须绑定到真实请求实例
Axios 的 onUploadProgress 是唯一可靠入口,但要注意它只在 XHR 模式下生效(即不走 fetch 适配器)。封装时需确保:
- 请求配置中显式传入
onUploadProgress: (e) => {...},不能依赖拦截器 - 从
ProgressEvent提取e.loaded和e.total,注意e.total === 0时降级显示“处理中…” - 避免在回调里直接修改 DOM 或调用复杂计算;只更新响应式状态,让模板自动响应
- 小文件可能触发一次 loaded === total,导致进度条闪动,可加最小延迟或节流(如
nextTick后更新)
支持取消与异常兜底是健壮性的分水岭
仅监听进度远远不够,真实场景中必须处理中断、超时、网络抖动:
审查 Vue 管理后台的变更请求(Vue 2 + Element UI,Vue 3 + Element Plus)。重点关注最小化变更实现、上线风险检查以及回归检查清单生成。
立即学习“前端免费学习笔记(深入)”;
- 上传前创建
AbortController,把signal传给 Axios 配置项 - 暴露
cancel()方法,在内部调用controller.abort()并重置状态 - 设置合理超时(如
timeout: 60000),超时后清空进度、标记 error - 当
onUploadProgress停止触发但 Promise 未结束时,启动心跳检测(如 5 秒无更新则判定失败) - 捕获
axios.isCancel判断是否为用户主动取消,区别于网络错误
与业务组件解耦,提供清晰 API 签名
组合式函数对外暴露的接口要像工具一样简单直接:
-
startUpload(file: File, options?: UploadOptions): Promise<uploadresult></uploadresult>—— 触发上传,返回带进度订阅能力的 Promise -
getProgress(id: string): Ref<progressinfo></progressinfo>—— 按 ID 获取实时进度引用 -
cancel(id: string): void—— 中断指定任务 -
clear(): void—— 清理所有任务状态(适合页面卸载前调用)
组件内只需调用 startUpload,再用 v-if 或 v-show 控制进度条显隐,无需关心底层事件绑定或清理逻辑。

















