useAjax.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { message } 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>, options?: { type: 'table' | "noPage" }): 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. // 表单接口处理参数
  34. if (options?.type === 'table') {
  35. params.pageNum = params.current
  36. delete params.current
  37. }
  38. return fnc(params).then(res => {//开启请求
  39. setLoding(() => false)//关闭请求加载
  40. setData(() => res)//设置data
  41. if (res?.code === 500) {
  42. message.error(res?.msg)
  43. return res
  44. }
  45. if (options?.type === 'table') {//表单数据返回
  46. return {
  47. data: res.data.records,
  48. total: res.data.total,
  49. current: res.data.current,
  50. pageSize: res.data.size,
  51. success: res.success
  52. }
  53. }
  54. if(options?.type === 'noPage'){
  55. return {
  56. current: 1,
  57. data: res.data,
  58. pageSize: 20,
  59. total: res.data.length,
  60. success: true
  61. }
  62. }
  63. return res//返回data
  64. }).catch(err => {
  65. console.log(err)
  66. setLoding(() => false)//关闭请求加载
  67. return err
  68. })
  69. }
  70. async function refresh() {//上次的请求
  71. setLoding(() => true)//开启加载
  72. return fnc(oldParams).then(res => {//开启请求
  73. setLoding(() => false)//关闭请求加载
  74. setData(() => res)//设置data
  75. return res//返回data
  76. })
  77. }
  78. async function initData() {
  79. setData(null)
  80. }
  81. // 修改保存数据
  82. async function mutate(data: any) {
  83. setData(data)
  84. }
  85. return { loading, data, run, refresh, initData, mutate }
  86. }