在Vue3中封装常用hooks之useTable

在项目开发中经常会使用Table,我们用的antd或者element等前端UI框架中的Table组件需要传递一些参数,比如tableData、pagination、tableData还有就是一些查询的方法和参数,每次使用都要重新声明就很繁琐,所以现在就来封装一个Vue3中的useTable

1.代码实现

话不多说直接上代码

/*
 * @Author: yjl
 * @Date: 2023-04-14 15:48:48
 * @LastEditors: yjl
 * @Description: useTable
 */
import { reactive, toRefs } from 'vue'
interface Pagination {
  currentPage: number
  pageSize: number
  total: number
  showTotal?: any
  showSizeChanger?: boolean
  showQuickJumper?: boolean
  pageSizeOptions?: Array<string>
}
interface tableParams {
  pagination: Pagination
  tableData: any[]
  seachParams: object
}
/**
 * 封装需求
 * 1.返回一个tableData
 * 2.返回一个分页
 * 3.返回一个查询tableData的方法
 * 4.返回一个分页change方法
 * 5.返回一个分页大小change方法
 * 6.返回一个reset方法
 * 7.返回一个seach方法
 * 8.返回一个seachParam的对象
 * 9.返回一个可设置tableData的方法
 */
/**
 *  参数说明
 * @param api 请求接口的api(必传)
 * @param initParams 初始化默认参数(非必填)
 * @param callBack 拿到数据后的回调方法方便处理数据
 * @returns
 */
export const useTable = (
  api: (param: any) => Promise<any>,
  initParams: object = {},
  callBack?: Function,
) => {
  const state = reactive<tableParams>({
    pagination: {
      currentPage: 1,
      pageSize: 10,
      total: 0,
    },
    tableData: [],
    seachParams: {},
  })
  //请求table数据
  function queryTableData() {
    const postData = {
      ...state.pagination,
      ...state.seachParams,
      ...initParams,
    }
    return api(postData).then((res) => {
      //如果要处理返回数据的话
      callBack && (res = callBack(res))
      // 复制给table
      state.tableData = res.currentPageData
      // 赋值总数
      state.pagination.total = res.totalCount
      return res
    })
  }
  //分页change
  function handPageChange(page) {
    state.pagination.currentPage = page
    queryTableData()
  }
  //分页大小change
  function handPageSizeChange(current, size) {
    console.log(size)
    state.pagination.pageSize = size
    queryTableData()
  }
  //搜索
  function handSeach() {
    state.pagination.currentPage = 1
    queryTableData()
  }
  //重置搜索
  function reset() {
    state.pagination.currentPage = 1
    state.seachParams = {}
    queryTableData()
  }
  function setTableData(data: any[]) {
    state.tableData = data
  }
  return {
    ...toRefs(state),
    handPageChange,
    queryTableData,
    handSeach,
    handPageSizeChange,
    reset,
    setTableData,
  }
}

2.使用

 import { useTable } from '/@/hooks/web/useTable'  //引入
 let { 	pagination, //分页对象
 		tableData, //列表数据
 		seachParams, //查询条件对象
 		queryTableData,//获取数据的方法
  		handPageChange, //分页change以及分页大小change
  		handPageSizeChange } =useTable(queryList)  //queryList为项目中封装的API

3.总结

大致就这样,其实还有很多参数没写上,这个算是一个简易版的useTable吧

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Vue3,我们可以使用Composition API来封装组件和自定义Hooks函数。引用提到的文章《浅谈:为啥vue和react都选择了Hooks🏂?》给出了对Hook的介绍和解释。通过使用Hooks,我们可以更好地解决在组件封装过程遇到的问题。 在Vue3,我们可以使用Composition API来封装我们的组件。引用提到的JeecgBoot—Vue3版前端源码是一个使用Vue3.0和Ant-Design-Vue等新技术方案进行开发的项目。它采用了Composition API来进行二次封装组件、utils、hooks等功能的实现。 使用Composition API封装Hooks函数可以实现代码的复用。引用提到,Composition API相比Vue2的mixin更清晰地展示了Hooks函数的来源和功能。通过自定义封装Hooks函数,我们可以将常用的逻辑进行抽离,并在多个组件进行复用。 因此,通过使用Composition API和自定义Hooks函数,我们可以在Vue3进行组件的封装和复用。这样可以更好地解决在合作开发每个人封装习惯不同的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3 hooks 组件封装](https://blog.csdn.net/longxiaobao123/article/details/128784119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JeecgBoot平台前端Vue3源码](https://download.csdn.net/download/dcs_pk/88099139)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vue3 Hooks函数使用及封装思想](https://blog.csdn.net/m0_46846526/article/details/131252270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值