blob: b53da73169a65dfc1089108e48b4caadecc21cd9 [file] [log] [blame]
import { useState, useEffect, useCallback } from 'react'
import { data } from 'react-router'
// type RequestFunction<T> = () => Promise<T>
type RequestFunction<T, P = any> = (params?: P) => Promise<T>;
interface UseApiResult<T> {
data: T | null
loading: boolean
error: Error | null
refresh: () => void
}
// export function useApi<T>(
// requestFn: RequestFunction<T>,
// immediate = true
// ): UseApiResult<T> {
export function useApi<T, P = any>(
requestFn: RequestFunction<T, P>, // 接收参数
immediate = true
) {
const [data, setData] = useState<T | null>(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState<Error | null>(null)
const execute = useCallback(async (params?: P) => { // 添加参数
try {
setLoading(true)
const result = await requestFn(params);//传参
setData(result)
setError(null)
return result // 返回请求结果
} catch (err) {
setError(err as Error)
throw err
} finally {
setLoading(false)
}
}, [requestFn])
useEffect(() => {
if (immediate) {
execute()
}
}, [execute, immediate])
return { data, loading, error, refresh: execute }
}