| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // composables/useUpload.js
- import { ref } from 'vue';
- import { upload } from '../utils/request';
- /**
- * 图片上传组合式函数(管理上传状态)
- * @param {Object} defaultOptions - 默认上传配置(如url、name)
- * @param {boolean} [immediate=false] - 是否立即执行(默认false,需手动调用upload)
- * @returns {Object} - { loading, progress, data, error, upload, reset }
- */
- export const useUpload = (defaultOptions = {}, immediate = false) => {
- const loading = ref(false); // 整体加载状态
- const progress = ref(0); // 上传进度(0-100,多文件时取平均值)
- const data = ref(null); // 上传成功结果
- const error = ref(null); // 错误信息
- // 重置状态
- const reset = () => {
- loading.value = false;
- progress.value = 0;
- data.value = null;
- error.value = null;
- };
- // 核心上传方法
- const uploadFile = async (customOptions = {}) => {
- reset(); // 上传前重置状态
- loading.value = true;
- try {
- // 合并默认配置与自定义配置(自定义配置优先级更高)
- const finalOptions = {
- ...defaultOptions,
- ...customOptions,
- // 进度监听(覆盖默认,统一处理进度)
- onProgressUpdate: (res) => {
- progress.value = res.progress; // 更新进度
- // 若有自定义进度监听,执行它
- if (customOptions.onProgressUpdate) {
- customOptions.onProgressUpdate(res);
- }
- },
- };
- // 调用上传工具
- const result = await upload(finalOptions);
- data.value = result; // 保存上传结果
- return result;
- } catch (err) {
- error.value = err; // 保存错误信息
- throw err; // 抛出错误,方便组件内捕获
- } finally {
- loading.value = false; // 结束加载
- }
- };
- // 若immediate为true,立即执行上传(需确保defaultOptions有filePath)
- if (immediate && defaultOptions.filePath) {
- uploadFile();
- }
- return {
- loading, // 加载中状态
- progress, // 上传进度
- data, // 成功结果
- error, // 错误信息
- upload: uploadFile, // 触发上传的方法
- reset, // 重置状态
- };
- };
|