useRequest.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { UnwrapRef, ref } from 'vue'
  2. type IUseRequestOptions<T> = {
  3. /** 是否立即执行 */
  4. immediate?: boolean
  5. /** 初始化数据 */
  6. initialData?: T
  7. }
  8. /**
  9. * useRequest是一个定制化的请求钩子,用于处理异步请求和响应。
  10. * @param func 一个执行异步请求的函数,返回一个包含响应数据的Promise。
  11. * @param options 包含请求选项的对象 {immediate, initialData}。
  12. * @param options.immediate 是否立即执行请求,默认为false。
  13. * @param options.initialData 初始化数据,默认为undefined。
  14. * @returns 返回一个对象{loading, error, data, run},包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。
  15. */
  16. export default function useRequest<T>(
  17. func: () => Promise<IResData<T>>,
  18. options: IUseRequestOptions<T> = { immediate: false },
  19. ) {
  20. const loading = ref(false)
  21. const error = ref(false)
  22. const data = ref<T>(options.initialData)
  23. const run = async () => {
  24. loading.value = true
  25. return func()
  26. .then((res) => {
  27. data.value = res.data as UnwrapRef<T>
  28. error.value = false
  29. return data.value
  30. })
  31. .catch((err) => {
  32. error.value = err
  33. throw err
  34. })
  35. .finally(() => {
  36. loading.value = false
  37. })
  38. }
  39. options.immediate && run()
  40. return { loading, error, data, run }
  41. }