useTable表格hooks封装和使用(Vue3)

表格是中后台频繁使用的组件,vue3提供了hooks写法能够大大减少代码量和提高复用性,以下是一个基于arco design vue组件库封装的表格hooks:useTable

这个hooks相比于其他表格hooks的优点:

  • apiapi 参数 不分离,不会破坏原有的接口api
  • api参数 能够在外面进行过滤
  • 分页参数 pagin: { page, size } 能够按需使用

usePagination 的封装

useTable 的封装

文档

api参数

名称 说明
api(pagin) 表格数据接口api,pagin: {page, size}

options参数

参数 说明
formatResult 结果数据集过滤
onSuccess 数据请求成功回调
immediate 是否立即触发请求(默认true)
rowKey 表格的数据rowKey

useTable 的使用

源码

js 复制代码
import type { TableInstance } from '@arco-design/web-vue'
import { usePagination } from '@/hooks'

interface Options<T> {
  formatResult?: (data: T[]) => any
  onSuccess?: () => void
  immediate?: boolean
  rowKey?: keyof T
}

type PaginationParams = { page: number; size: number }
type Api<T> = (params: PaginationParams) => Promise<ApiRes<ApiListData<T[]>>>

export default function <T>(api: Api<T>, options?: Options<T>) {
  const { formatResult, onSuccess, immediate, rowKey } = options || {}
  const { pagination, setTotal } = usePagination(() => getTableData())
  const loading = ref(false)
  const tableData = ref<T[]>([])

  const getTableData = async () => {
    try {
      loading.value = true
      const res = await api({ page: pagination.current, size: pagination.pageSize })
      tableData.value = formatResult ? formatResult(res.data.list) : res.data.list
      setTotal(res.data.total)
      onSuccess && onSuccess()
    } catch (error) {
    } finally {
      loading.value = false
    }
  }

  const isImmediate = immediate ?? true
  isImmediate && getTableData()

  // 多选
  const selectKeys = ref<(string | number)[]>([])
  const select: TableInstance['onSelect'] = (rowKeys) => {
    selectKeys.value = rowKeys
  }

  // 全选
  const selectAll: TableInstance['onSelectAll'] = (checked) => {
    const key = rowKey ?? ('id' as keyof T)
    selectKeys.value = checked ? tableData.value.map((i) => i[key] as string | number) : []
  }

  return { loading, tableData, getTableData, pagination, selectKeys, select, selectAll }
}

来源

Gi Admin Pro

相关推荐
沿着路走到底8 小时前
JS事件循环
java·前端·javascript
子春一28 小时前
Flutter 2025 可访问性(Accessibility)工程体系:从合规达标到包容设计,打造人人可用的数字产品
前端·javascript·flutter
白兰地空瓶8 小时前
别再只会调 API 了!LangChain.js 才是前端 AI 工程化的真正起点
前端·langchain
jlspcsdn9 小时前
20251222项目练习
前端·javascript·html
一 乐9 小时前
酒店预约|基于springboot + vue酒店预约系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
行走的陀螺仪10 小时前
Sass 详细指南
前端·css·rust·sass
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ10 小时前
React 怎么区分导入的是组件还是函数,或者是对象
前端·react.js·前端框架
LYFlied10 小时前
【每日算法】LeetCode 136. 只出现一次的数字
前端·算法·leetcode·面试·职场和发展
子春一210 小时前
Flutter 2025 国际化与本地化工程体系:从多语言支持到文化适配,打造真正全球化的应用
前端·flutter
前端无涯10 小时前
React/Vue 代理配置全攻略:Vite 与 Webpack 实战指南
vue.js·react.js