封装table查询hook

table查询hook

/**
 * @param {function} apiFun table查询接口 
 * @param {object} initSearch 初始化查询参数 
 */
const useDataApi = (apiFun, initSearch={}) => {}

想法
table的数据和状态(table的数据和状态太多,抽取成一个reducer)
分页的状态
查询的状态
分页状态修改的方法
查询状态修改的方法
请求参数的状态,将请求参数抽取出来,useEffect只需要监听接口方法和请求参数的变化

import { useReducer, useState, useEffect, useCallback } from 'react';

const FETCH_INIT = 'FETCH_INIT';  // 请求初始化
const FETCH_SUCCESS = 'FETCH_SUCCESS';  // 请求成功
const FETCH_FAILED = 'FETCH_FAILED'; // 请求失败

// 分页初始化配置
const initPagination = {
  current: 1,
  pageSize: 10,
  pageSizeOptions: ["3", "10", "20", "30"],
  showQuickJumper: true,
  showSizeChanger: true,
  total: 0
}


// table初始化数据和状态
const initState = {
  loading: false,
  error: false,
  data: [],
  total: 0
};




function reducer(state, action) {
  switch (action.type) {
    case FETCH_INIT:
      return {
        ...state,
        loading: true,
        error: false
      };
    case FETCH_SUCCESS:
      return {
        data: action.payload,
        total: action.total,
        loading: false,
        error: false
      };
    case FETCH_FAILED:
      return {
        data: [],
        total: 0,
        loading: false,
        error: true
      };
    default:
      return state;
  }
}

const useDataApi = (apiFun, initSearch={}) => {
  // 列表数据和状态
  const [state, dispatch] = useReducer(reducer, initState);
  // 搜索框
  const [search, setSearch] = useState(initSearch);
  // 分页
  const [pagination, setPagination] = useState(initPagination);
  // 查询参数
  const [query, setQuery] = useState({
    ...initSearch,
    current: initPagination.current,
    size: initPagination.pageSize
  })

  useEffect(() => {
    let didCancel = false;
    const fetchData = async () => {
      dispatch({
        type: FETCH_INIT
      })
      try {
        const res = await apiFun(query);
        if (!didCancel) {
          dispatch({
            type: FETCH_SUCCESS,
            payload: res.content.list,
            total: res.content.totalCount
          })
        }
      } catch (error) {
        if (!didCancel) {
          dispatch({
            type: FETCH_FAILED
          })
        }
      }
    };

    fetchData();

    return () => {
      didCancel = true;
    }
  }, [apiFun, query]);


  // 分页调整
  const changePagination = (pagi = initPagination) => {
    setPagination(pagi);
    setQuery({
      ...search,
      current: pagi.current,
      size: pagi.pageSize
    })
  }

  // search
  const changeSearch = useCallback((searchObj) => {
    setSearch(searchObj);
    setPagination(initPagination);
    setQuery({
      ...searchObj,
      current: initPagination.current,
      size: initPagination.pageSize
    });
  }, [])

  return {
    state,
    search,
    pagination: {
      ...pagination,
      total: state.total
    },
    changeSearch,
    changePagination
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值