blob: b53da73169a65dfc1089108e48b4caadecc21cd9 [file] [log] [blame]
San3yuan4d0e8032025-04-04 17:21:40 +08001import { useState, useEffect, useCallback } from 'react'
2import { data } from 'react-router'
3
阳菜,放晴!7e1e3a52025-06-05 23:00:51 +08004// type RequestFunction<T> = () => Promise<T>
5type RequestFunction<T, P = any> = (params?: P) => Promise<T>;
San3yuan4d0e8032025-04-04 17:21:40 +08006
7interface UseApiResult<T> {
8 data: T | null
9 loading: boolean
10 error: Error | null
11 refresh: () => void
12}
13
阳菜,放晴!7e1e3a52025-06-05 23:00:51 +080014// export function useApi<T>(
15// requestFn: RequestFunction<T>,
16// immediate = true
17// ): UseApiResult<T> {
18export function useApi<T, P = any>(
19 requestFn: RequestFunction<T, P>, // 接收参数
20 immediate = true
21) {
San3yuan4d0e8032025-04-04 17:21:40 +080022 const [data, setData] = useState<T | null>(null)
23 const [loading, setLoading] = useState(false)
24 const [error, setError] = useState<Error | null>(null)
25
阳菜,放晴!7e1e3a52025-06-05 23:00:51 +080026 const execute = useCallback(async (params?: P) => { // 添加参数
San3yuan4d0e8032025-04-04 17:21:40 +080027 try {
28 setLoading(true)
阳菜,放晴!7e1e3a52025-06-05 23:00:51 +080029 const result = await requestFn(params);//传参
San3yuan4d0e8032025-04-04 17:21:40 +080030 setData(result)
31 setError(null)
32 return result // 返回请求结果
33 } catch (err) {
34 setError(err as Error)
35 throw err
36 } finally {
37 setLoading(false)
38 }
39 }, [requestFn])
40
41 useEffect(() => {
42 if (immediate) {
43 execute()
44 }
45 }, [execute, immediate])
46
47 return { data, loading, error, refresh: execute }
48 }