Skip to content

Table 表格

基于 ElTable 封装,集成分页、多选、远程数据加载等功能。

基础用法

vue
<template>
  <div>
    <div>isReload: {{ isReload }}</div>
    <div>selectKeys: {{ selectKeys }}</div>
    <MTable
      v-model:is-reload="isReload"
      v-model:select-keys="selectKeys"
      :columns="tableColumns"
      :data="userList"
      :http="getDemoUserList"
      :params="params"
    >
      <template #extra>
        <el-button v-auth="searchBtnPermission" @click="isReload = true"
          >重置</el-button
        >
        <el-button v-auth:tableSearch @click="params.q = 456"
          >params.q = 456</el-button
        >
        <el-button @click="setSelectKeys">选中id 1~10</el-button>
      </template>

      <template #createAt="{ value }">
        <span v-dateFormat:YYYY-MM-DD="value"></span>
      </template>
      <template #actions="{ row, index, value }">
        <el-button size="small" @click="viewDetails({ row, index, value })"
          >详情</el-button
        >
      </template>
    </MTable>

    <MMarkdownView :value="readme"></MMarkdownView>
  </div>
</template>

<script setup lang="ts">
import readme from '@/components/table/README.md?raw'
import { ref, reactive } from 'vue'
import { tableColumns } from './config'
import { getDemoUserList } from '@/api/examples/user'

const isReload = ref(true)
const searchBtnPermission = ref('tableReset')

const userList = ref<any[]>(
  new Array(55).fill(0).map((_, index) => ({
    id: index + 1,
    name: index + 1
  }))
)

// selectKeys
const selectKeys = ref<any[]>([1, 3, 5])
const setSelectKeys = () => {
  selectKeys.value = new Array(10).fill(0).map((_, index) => index + 1)
}

// params
const params = reactive({
  q: 123
})

const viewDetails = (scope: any) => {
  console.log(scope)
}
</script>

<style lang="scss" scoped></style>

列配置:

ts
import type { TableColumn } from '@/components'

export const tableColumns: TableColumn[] = [
  {
    key: '用户信息',
    label: '用户信息',
    children: [
      {
        key: 'name',
        label: '姓名',
        width: 200
      },
      {
        key: 'address',
        label: '地区',
        width: 200
      },
      {
        key: 'email',
        label: '邮箱'
      }
    ]
  },
  {
    key: 'userInfo.origin',
    label: '来源',
    customRender: (val) => val && '来源: ' + val
  },
  {
    key: 'createAt',
    label: '创建日期',
    slot: true
  },
  {
    key: 'updateAt',
    label: '更新日期'
  },
  {
    key: 'actions',
    label: '操作',
    slot: true,
    fixed: 'right'
  }
]

API

Table 属性

属性名说明类型默认值
series显示序号列booleantrue
columns表格列配置TableColumn[]
selectable决定 CheckBox 是否可勾选(row: any, index: number) => boolean
selectKeys多选框 v-modelarray
selectKeysKeep切换页码时不根据 table 数据过滤 selectKeysbooleanfalse
rowKey行数据的 Keystring | ((row) => any)'id'
paginationConfig分页器配置,设为 false 关闭分页false | TablePaginationOptions
loading显示加载动画boolean
data静态数据(http 和 data 同时设置时使用 http)array[]
httpLazyhttp 不立即执行,params 变化或 isReload=true 时调用booleanfalse
isReload重新请求 http(v-model)booleanfalse
http获取数据的接口(params) => Promise<{data: [], count: number}>
paramshttp 额外参数object{}

TableColumn

属性名说明类型默认值
key唯一值string
label列标签string
slot开启 name=key 的插槽booleanfalse
width列宽度number
fixed列固定'left' | 'right'
attrsElTableColumn 属性object
customRender自定义渲染内容(value, row, index) => string
children多级表头TableColumn[]

TablePaginationOptions

属性名说明类型默认值
currentPage当前页number1
pageSize每页条数number10
pageSizes每页条数可选项number[][10, 20, 30]

Table 插槽

插槽名说明
extra额外内容,table 右上角,推荐用于放置操作按钮
[column key]TableColumn slot 为 true 时开启

基于 MIT 许可发布