封装一个请求的hook(react函数组件)

对于后台系统,上面筛选,下面表格分页的页面,这个hook非常实用

omitBy方法:过滤不为undefined的对象属性

javascript 复制代码
export const omitBy = <T extends IObject, K extends keyof T>(object:T, predicate:(value:T[K]) => boolean):IObject => {
  if (typeof object !== 'object') {
    return object;
  }
  const newObject:IObject = {};

  Object.keys(object).forEach((item) => {
    if (predicate(object[item])) {
      newObject[item] = object[item];
    }
  });
  return newObject;
};
javascript 复制代码
export const useFetchHook = (fetchPromiseFunc:(params?:any) => Promise<any>, params?:any, initialData?:any, deps?:ReadonlyArray<any>, fetchFlag?:boolean) => {
  const [data, setData] = useState(initialData);
  const [loading, setLoading] = useState(false);
  console.log('重新执行了该hook');

  // 处理对象参数:当value为空时,omit该参数
  const formattedParams = omitBy(params, (item) => item !== undefined );
  useEffect(() => {
    const fetchData = async() => {
      try {
        setLoading && setLoading(true);
        const result = await fetchPromiseFunc(formattedParams);
        if (result.status.toString() !== '200') {
          if(result.data.error_code) {
            //todo sth...
          } else if(result.data.statusText){
            message.error(result.data.statusText);
          } else if(result.data.msg) {
            message.error(result.data.msg || '接口异常');
          }
        } else {
          setData(result.data);
        }
        setLoading && setLoading(false);
      } catch (error) {
        setLoading && setLoading(false);
      }
    };
    if(fetchFlag === undefined || fetchFlag) {
      fetchData();
    }else {
      setData(initialData);
    }
  }, deps ? deps : []);
  return [data, loading];
};

使用

javascript 复制代码
const [classData, loading] = useFetchHook(yourFetchFunc, { ...filterParams, ...paginationParams }, [], [filterParams, paginationParams, filterFlag]);

filterParams: 用在筛选条件

paginationParams:分页筛选

filterFlag:其他自定义筛选

相关推荐
IT_陈寒8 分钟前
Python的列表推导式用不好真的会爆内存你知道吗
前端·人工智能·后端
moshuying24 分钟前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
kyriewen26 分钟前
我算了笔账:AI 编程工具一年烧掉两台 MacBook
前端·人工智能·程序员
moshuying1 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
qq_401700412 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32
liyi_hz20082 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
输出输入2 小时前
学习前端主流书单推荐
前端
anyup2 小时前
uView Pro X 1.0.0 发布:全面支持 uni-app x 蒸汽模式,80+ 组件
前端·uni-app·ai编程
apollo_qwe2 小时前
大模型 API 接通了,AI 聊天页面为什么还是不好用?
前端·vue.js·人工智能
爱勇宝2 小时前
你可能成不了技术大佬,然后呢?
前端·后端·程序员