useAjax.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { App } from 'antd'
  2. import { useState } from 'react'
  3. export interface AjaxPromise {
  4. /**请求*/
  5. run: (params?: any) => Promise<any>,
  6. /**执行上次的请求*/
  7. refresh: () => Promise<any>,
  8. /** 修改data */
  9. mutate: (data: any) => void
  10. /**清空data*/
  11. initData: () => void,
  12. /**loding状态*/
  13. loading: boolean,
  14. /**data数据*/
  15. data: any,
  16. }
  17. /**
  18. * ajax封装方法 hook 方法不要使用在非页面中
  19. * @returns run 请求操作
  20. * @returns refresh 执行上次请求
  21. * @returns loading 请求状态
  22. * @returns data 请求结果数据
  23. * @returns initData 初始data
  24. * */
  25. export function useAjax(fnc: (params?: any) => Promise<any>): AjaxPromise {
  26. const {message}= App.useApp()
  27. const [loading, setLoding] = useState(false)//状态
  28. const [data, setData] = useState<any>()//数据
  29. const [oldParams, setOldParasm] = useState()
  30. async function run(params?: any) {//请求
  31. setLoding(() => true)//开启加载
  32. setOldParasm(() => params)//存放本次请求参数
  33. return fnc(params).then(res => {//开启请求
  34. setLoding(() => false)//关闭请求加载
  35. setData(() => res)//设置data
  36. if (res?.code === 500) {
  37. message.error(res?.msg)
  38. return undefined
  39. } else {
  40. return res//返回data
  41. }
  42. }).catch(err=>{
  43. console.log(err)
  44. setLoding(() => false)//关闭请求加载
  45. })
  46. }
  47. async function refresh() {//上次的请求
  48. setLoding(() => true)//开启加载
  49. return fnc(oldParams).then(res => {//开启请求
  50. setLoding(() => false)//关闭请求加载
  51. setData(() => res)//设置data
  52. return res//返回data
  53. })
  54. }
  55. async function initData() {
  56. setData(null)
  57. }
  58. // 修改保存数据
  59. async function mutate(data: any) {
  60. setData(data)
  61. }
  62. return { loading, data, run, refresh, initData, mutate }
  63. }