项目中的封装思想

一. 用高阶函数hooks封装请求

以处理请求和分页器为例:

//hooks  用高阶函数统一管理请求和分页
// 统一处理table的数据和请求处理
import { ref, reactive, unref } from "vue";
import type { Ref } from "vue";

// api 必传: 比如 api.admin.getAdminList
// queryParams 可选 : 比如  api.admin.getAdminList需要的参数 如 :keyword pageNum , pageSize
function useTable<
  P,
  R extends {
    list: any;
    pageNum: number;
    pageSize: number;
    total: number;
    totalPage: number;
  }
>(api: (data?: P) => Promise<R>, queryParams?: P) {
  // 分页器
  let pagination = reactive({
    pageNum: 1,
    pageSize: 5,
    total: 0,
    totalPage: 0,
  });
  // 获取data的列表数据
  let tableData: Ref<R["list"]> = ref([]);
  async function getTableData() {
    // console.log(queryParams); // 传过来的queryParams 已经变成 ref 类型
    // 定义一个普通的对象 ,遍历queryParams并将每一个key和value赋值给这个对象,得到一个新对象
    let normalQueryParams = {} as P;
    if (typeof queryParams === "object") {
      for (let key in queryParams) {
        // console.log(key);
        // console.log(unref(queryParams[key]));
        // unref 可以直接将响应式转为普通数据
        normalQueryParams[key] = unref(queryParams[key]);
      }
    }
    // console.log("...",{...normalQueryParams});
    // 发请求
    let result = await api({
      pageNum: pagination.pageNum,
      pageSize: pagination.pageSize,
      ...normalQueryParams,
    });
    // console.log(result);
    tableData.value = result.list;
    pagination.pageNum = result.pageNum;
    pagination.pageSize = result.pageSize;
    pagination.total = result.total;
    pagination.totalPage = result.totalPage;
  }
  getTableData();
  // 每页条数发生变化时的处理
  let handleSizeChange = (val: number) => {
    // console.log(val);
    pagination.pageSize = val;
    getTableData();
  };
  // 改变当前页数的处理
  let handleCurrentChange = (val: number) => {
    pagination.pageNum = val;
    getTableData();
  };
  return {
    getTableData,
    tableData,
    pagination,
    handleSizeChange,
    handleCurrentChange,
  };
}

export default useTable;

外部调用传参:

let { tableData, getTableData } = useTable(xxxapi, { keyword: iptval.value })

 

二. 封装工具类函数

以处理时间格式为例:

// 我们自己项目当中需要的工具  函数
// 有一个函数 将时间对象 格式化
export const formalDate = (val: string | undefined) => {
  // 如果没有要转换的时间对象 就返回一个 空
  if (!val) {
    return "";
  }
  // 转换
  // 1. 需要将字符串 转为 Date 对象
  let date = new Date(val);
  // 2. 将年月日  时分秒 使用特殊的符号 分割
  date.setHours(date.getHours() + 8);
  return date.toJSON().replace('T',' ').replace('.000Z','');
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值