import { message } from 'antd' import { useState } from 'react' export interface AjaxPromise { /**请求*/ run: (params?: any) => Promise, /**执行上次的请求*/ refresh: () => Promise, /** 修改data */ mutate: (data: any) => void /**清空data*/ initData: () => void, /**loding状态*/ loading: boolean, /**data数据*/ data: any, } /** * ajax封装方法 hook 方法不要使用在非页面中 * @returns run 请求操作 * @returns refresh 执行上次请求 * @returns loading 请求状态 * @returns data 请求结果数据 * @returns initData 初始data * */ export function useAjax(fnc: (params?: any) => Promise, options?: { type: 'table' | "noPage" }): AjaxPromise { // const {message}= App.useApp() const [loading, setLoding] = useState(false)//状态 const [data, setData] = useState()//数据 const [oldParams, setOldParasm] = useState() async function run(params?: any) {//请求 setLoding(() => true)//开启加载 setOldParasm(() => params)//存放本次请求参数 // 表单接口处理参数 if (options?.type === 'table') { params.pageNum = params.current delete params.current } return fnc(params).then(res => {//开启请求 setLoding(() => false)//关闭请求加载 setData(() => res)//设置data if (res?.code === 500) { message.error(res?.msg) return res } if (options?.type === 'table') {//表单数据返回 return { data: res.data.records, total: res.data.total, current: res.data.current, pageSize: res.data.size, success: res.success } } if(options?.type === 'noPage'){ return { current: 1, data: res.data, pageSize: 20, total: res.data.length, success: true } } return res//返回data }).catch(err => { console.log(err) setLoding(() => false)//关闭请求加载 return err }) } async function refresh() {//上次的请求 setLoding(() => true)//开启加载 return fnc(oldParams).then(res => {//开启请求 setLoding(() => false)//关闭请求加载 setData(() => res)//设置data return res//返回data }) } async function initData() { setData(null) } // 修改保存数据 async function mutate(data: any) { setData(data) } return { loading, data, run, refresh, initData, mutate } }