You've already forked template-MP
新增:全量优化
This commit is contained in:
157
hooks/useApi.js
Normal file
157
hooks/useApi.js
Normal file
@@ -0,0 +1,157 @@
|
||||
import { ref, reactive } from 'vue'
|
||||
import { http } from '@/api/index.js'
|
||||
import tool from '@/common/utils/tool.js'
|
||||
|
||||
/**
|
||||
* GET请求Hook
|
||||
* @param {string} url 请求URL
|
||||
* @param {Object} options 配置选项
|
||||
* @returns {Object} 请求相关状态和方法
|
||||
*/
|
||||
export function useGet(url, options = {}) {
|
||||
const {
|
||||
manual = false, // 是否手动触发
|
||||
params = {}, // 请求参数
|
||||
cache = false, // 是否使用缓存
|
||||
loadingDelay = 0, // loading延迟时间
|
||||
onSuccess = () => {}, // 成功回调
|
||||
onError = () => {}, // 失败回调
|
||||
} = options
|
||||
|
||||
// 状态
|
||||
const data = ref(null)
|
||||
const loading = ref(false)
|
||||
const error = ref(null)
|
||||
|
||||
// loading延迟定时器
|
||||
let loadingTimer = null
|
||||
|
||||
/**
|
||||
* 执行GET请求
|
||||
* @param {Object} requestParams 请求参数
|
||||
*/
|
||||
async function run(requestParams = {}) {
|
||||
// 清除之前的loading延迟定时器
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
|
||||
// 如果有loading延迟,先启动定时器
|
||||
if (loadingDelay > 0) {
|
||||
loadingTimer = setTimeout(() => {
|
||||
loading.value = true
|
||||
}, loadingDelay)
|
||||
} else {
|
||||
loading.value = true
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await http.get(url, {
|
||||
params: { ...params, ...requestParams },
|
||||
cache,
|
||||
})
|
||||
// 清除loading延迟定时器
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
data.value = response.data
|
||||
error.value = null
|
||||
onSuccess(response.data)
|
||||
return response.data
|
||||
} catch (err) {
|
||||
// 清除loading延迟定时器
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
error.value = err
|
||||
data.value = null
|
||||
console.error(`GET请求失败: ${url}`, err)
|
||||
onError(err)
|
||||
throw err
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消请求
|
||||
*/
|
||||
function cancel() {
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
// 如果不是手动触发,立即执行
|
||||
if (!manual) {
|
||||
Promise.resolve().then(() => {
|
||||
run(params)
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
data,
|
||||
loading,
|
||||
error,
|
||||
run,
|
||||
cancel,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST请求Hook
|
||||
* @param {string} url 请求URL
|
||||
* @returns {Object} 请求相关状态和方法
|
||||
*/
|
||||
export function usePost(url) {
|
||||
/**
|
||||
* 执行POST请求
|
||||
* @param {Object} data 请求数据
|
||||
* @param {Object} options 配置选项
|
||||
*/
|
||||
async function run(data, options = {}) {
|
||||
const { loadingDelay = 0, onSuccess = () => {}, onError = () => {} } = options
|
||||
|
||||
let loadingTimer = null
|
||||
|
||||
// 如果有loading延迟,先启动定时器
|
||||
if (loadingDelay > 0) {
|
||||
loadingTimer = setTimeout(() => {
|
||||
tool.loading()
|
||||
}, loadingDelay)
|
||||
} else {
|
||||
tool.loading()
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await http.post(url, data)
|
||||
// 清除loading延迟定时器
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
tool.hideLoading()
|
||||
onSuccess(response.data)
|
||||
return response.data
|
||||
} catch (err) {
|
||||
// 清除loading延迟定时器
|
||||
if (loadingTimer) {
|
||||
clearTimeout(loadingTimer)
|
||||
loadingTimer = null
|
||||
}
|
||||
tool.hideLoading()
|
||||
console.error(`POST请求失败: ${url}`, err)
|
||||
onError(err)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
run,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user