Table 表格

快速的数据化配置一个带有分页排序的表格布局表单。

基础使用

当分页和排序发生变化,会同步参数到 page 对象,同时触发 request 请求。

要显示分页至少需要配置 currentPage pageSize total | pageCount 三个属性。

表格的 default-sort 属性的 {prop, order}page 属性的 {sortProp, sortOrder} 代替。

点击查看代码
<template>
  <div class="demo">
    <AgelTable ref="tableRef" v-bind="table" v-model:page="table.page"> </AgelTable>
  </div>
</template>

<script lang="tsx" setup>
import { reactive, onMounted, ref } from 'vue'
import { ElMessage, } from 'element-plus'
import http from "./utils/http"

type Row = { name: string, date: string, address: string }

const tableRef = ref()
const table = reactive({
  loading: false,
  data: [] as Row[],
  height: '300px',
  columns: [
    { label: '#', type: 'selection', width: 50, align: 'center' },
    {
      label: '个人',
      children: [
        { label: '名称', prop: "name", sortable: 'custom' },
        { label: '日期', prop: 'date', sortable: 'custom' },
        { label: '地址', prop: 'address', width: 300, },
      ]
    },
  ],
  page: { currentPage: 1, pageSize: 10, total: 0, sortProp: 'name', sortOrder: 'ascending', },
  request: () => {
    const query = {
      page: table.page.currentPage,
      size: table.page.pageSize,
      sortProp: table.page.sortProp,
      sortOrder: table.page.sortOrder
    }
    table.data.length > 0 && ElMessage.success('参数:' + JSON.stringify(query))
    table.loading = true
    http('/mock/table', query).then((res: any) => {
      table.data = res.data.list
      table.page.total = res.data.total
      table.loading = false
    })
  },
  onSelectionChange: () => {
    console.log(tableRef.value.getRef())
    // const names = tableRef.value?.getRef().getSelectionRows().map((v: Row) => v.name).join()
    // names.length > 0 && ElMessage.success('选中:' + names)
  }
})

onMounted(() => {
  table.request()
})
</script>

插槽使用

属性 label slot 可以为一个渲染函数,使用 jsx 大幅提高体验。

开启模板插槽,slot 属性必须 slot- 开头。

点击查看代码
<template>
  <div class="demo">
    <AgelTable :data="data" :columns="columns">

      <template #prepend>
        <ElTableColumn label="#" type="index"></ElTableColumn>
      </template>

      <template #slot-date="{ row }">
        <ElTag>{{ row.date }}</ElTag>
      </template>

    </AgelTable>
  </div>

</template>

<script lang="tsx" setup>

const columns = [
  {
    label: () => <el-tag>名称</el-tag>,
    slot: ({ row }: any) => <el-tag>{row.name}</el-tag>,
  },
  { label: '日期', slot: 'slot-date' },
]

const data = Array.from({ length: 6 }).map(v => {
  return {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  }
})

</script>

自动合并

设置 merge.keys 选择要自动合并列的 prop。

设置 merge.direction 选择合并方向,也可设置 auto 自动合并。

点击查看代码
<template>
  <div class="demo">
    <AgelRadio v-model="direction" :options="options"></AgelRadio>
    <AgelTable border :data="data" :columns="columns" :merge="(merge as any)">
    </AgelTable>
  </div>
</template>

<script lang="tsx" setup>
import { ref, computed } from 'vue'

const direction = ref('vertical')
const options = [
  { label: '竖向合并', value: 'vertical', },
  { label: '横向合并', value: 'horizontal', },
  { label: '自动合并', value: 'auto', },
]
const merge = computed(() => {
  return { keys: ['name', 'date', 'address'], direction: direction.value }
})

const columns = [
  { label: '名称', prop: 'name' },
  { label: '日期', prop: 'date' },
  { label: '地址', prop: 'address' },
]

const data = [
  { date: "Apple", name: "Apple", address: "Apple" },
  { date: '2016-05-03', name: 'Xiaomi', address: 'Samsung', },
  { date: '2016-05-02', name: 'Xiaomi', address: 'Samsung' },
  { date: '2016-05-04', name: 'Xiaomi', address: 'Samsung' },
  { date: '2016-05-01', name: 'Xiaomi', address: 'Samsung' },
]

</script>

属性

属性类型默认值说明
loadingboolean-是否加载中
columnsColumnProps[]-表格配置项
pagePageProps-分页排序参数
mergeMergeProps自动合并单元格
......--ElTable 属性open in new window

ColumnProps

属性类型默认值说明
labelstring | RenderFunction-列标题
slotstring | RenderFunction-列插槽
hiddenboolean-列是否不可见
childrenColumnProps[]-多级表头
......--ElTableColumn 属性open in new window

PageProps

属性类型默认值说明
sortPropstring-排序列 prop
sortOrder'ascending'|'descending'|null-排序列方式
...--ElPagination 属性open in new window

MergeProps

属性类型默认值说明
keysstring[]-合并列的prop集合
direction'vertical' | 'horizontal'| 'auto''auto'合并方向

方法

名称参数说明
getRef-获取 elTable 组件实例

插槽

名称插槽作用域说明
slot-xx{row,$index,column}列具名插槽
prepend-columns 前置插槽
append-columns 后置插槽
empty-ELTable empty 插槽
append-row-ELTable append 插槽
Last Updated:
Contributors: agrass, liujianfeng