useUpload.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // composables/useUpload.js
  2. import { ref } from 'vue';
  3. import { upload } from '../utils/request';
  4. /**
  5. * 图片上传组合式函数(管理上传状态)
  6. * @param {Object} defaultOptions - 默认上传配置(如url、name)
  7. * @param {boolean} [immediate=false] - 是否立即执行(默认false,需手动调用upload)
  8. * @returns {Object} - { loading, progress, data, error, upload, reset }
  9. */
  10. export const useUpload = (defaultOptions = {}, immediate = false) => {
  11. const loading = ref(false); // 整体加载状态
  12. const progress = ref(0); // 上传进度(0-100,多文件时取平均值)
  13. const data = ref(null); // 上传成功结果
  14. const error = ref(null); // 错误信息
  15. // 重置状态
  16. const reset = () => {
  17. loading.value = false;
  18. progress.value = 0;
  19. data.value = null;
  20. error.value = null;
  21. };
  22. // 核心上传方法
  23. const uploadFile = async (customOptions = {}) => {
  24. reset(); // 上传前重置状态
  25. loading.value = true;
  26. try {
  27. // 合并默认配置与自定义配置(自定义配置优先级更高)
  28. const finalOptions = {
  29. ...defaultOptions,
  30. ...customOptions,
  31. // 进度监听(覆盖默认,统一处理进度)
  32. onProgressUpdate: (res) => {
  33. progress.value = res.progress; // 更新进度
  34. // 若有自定义进度监听,执行它
  35. if (customOptions.onProgressUpdate) {
  36. customOptions.onProgressUpdate(res);
  37. }
  38. },
  39. };
  40. // 调用上传工具
  41. const result = await upload(finalOptions);
  42. data.value = result; // 保存上传结果
  43. return result;
  44. } catch (err) {
  45. error.value = err; // 保存错误信息
  46. throw err; // 抛出错误,方便组件内捕获
  47. } finally {
  48. loading.value = false; // 结束加载
  49. }
  50. };
  51. // 若immediate为true,立即执行上传(需确保defaultOptions有filePath)
  52. if (immediate && defaultOptions.filePath) {
  53. uploadFile();
  54. }
  55. return {
  56. loading, // 加载中状态
  57. progress, // 上传进度
  58. data, // 成功结果
  59. error, // 错误信息
  60. upload: uploadFile, // 触发上传的方法
  61. reset, // 重置状态
  62. };
  63. };