You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.9 KiB
JavaScript
59 lines
1.9 KiB
JavaScript
import { ref } from "vue"
|
|
|
|
/**
|
|
* 用于执行 API 请求和管理相关状态的自定义钩子。
|
|
*
|
|
* @param {Function} apiF - 表示 API 请求的异步函数。
|
|
* @param {Object} [opt={}] - 可选配置选项。
|
|
* @param {Ref<boolean>} [opt.loading=false] - 可选的 loading 状态变量。
|
|
*
|
|
* @returns {Object} - 包含响应式变量和 fetchData 函数的对象。
|
|
* @property {Ref<boolean>} loading - 表示 API 请求加载状态的 ref。
|
|
* @property {Ref<any>} result - 表示 API 请求结果的 ref。
|
|
* @property {Ref<any>} error - 表示 API 请求失败时的错误的 ref。
|
|
* @property {Function} fetchData - 用于执行 API 请求并更新状态变量的函数。
|
|
*/
|
|
export const useApi = (apiF, opt = {}) => {
|
|
// 使用 ref 包装状态变量
|
|
const loading = opt.loading || ref(false)
|
|
const result = ref(null)
|
|
const error = ref(null)
|
|
|
|
/**
|
|
* 执行 API 请求并更新状态的函数。
|
|
*
|
|
* @param {*} p - 用于 API 请求的参数。
|
|
* @returns {Promise} - 包含 API 响应对象的 Promise。
|
|
*/
|
|
const fetchData = async (p) => {
|
|
try {
|
|
// 开始请求,设置 loading 为 true
|
|
loading.value = true
|
|
// 执行异步 API 请求
|
|
const res = await apiF(p)
|
|
|
|
// 根据返回的 code 判断请求是否成功
|
|
if (res.code === 0) {
|
|
// 请求成功,更新 result 变量
|
|
result.value = res
|
|
} else {
|
|
// 请求失败,更新 error 变量
|
|
error.value = res
|
|
}
|
|
|
|
// 返回 API 响应对象
|
|
return res
|
|
} catch (err) {
|
|
// 捕获异常,更新 error 变量并抛出错误
|
|
error.value = err
|
|
throw err
|
|
} finally {
|
|
// 无论请求成功或失败,都会在最终阶段设置 loading 为 false
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// 返回包含状态变量和 fetchData 函数的对象
|
|
return { loading, result, error, fetchData }
|
|
}
|