Skip to content
本页目录

GapTable

使用 antdesign Table 二次封装的基础表格组件

说明

  • 表格列存在 control_type 属性时,若需要气泡卡片,需将内容通过 slot 插槽传入,组件内部无默认值,不传则显示空
  • 多选或树形结构数据时 rowkey 必传且唯一

基本用法

组件演示

示例
vue
<template>
  <div id="app">
    <a-button @click="clearCheckData">清空选中项</a-button>
    <GapTable
      ref="tableRef"
      :columns="tableColumns"
      :dataSource="dataSource"
      @page-change="pageChange"
      @operate="handleOperate"
      :config-data="configData"
      @handleSelection="handleSelection"
      :unit-config="{ defaultVal: Units.tenThousand }"
      @on-expand="onExpand"
    >
      <template #customEllipsis="{ column, record }">
        <div v-if="column.dataIndex == 'forewarning'">
          {{ record.forewarning == 3 ? '超期' : record.forewarning == 1 ? '待付' : '正常' }}
        </div>
      </template>
      <template #expandedRowRender="{ record, index, indent, expanded }">
        <p>{{ record }}{{ index }}</p>
        <p>indent{{ indent }}</p>
        <p>expanded{{ expanded }}</p>
      </template>
    </GapTable>
  </div>
</template>
<script lang="ts" setup>
import { ref, h } from 'vue'
import { AlertFilled } from '@ant-design/icons-vue'
// 引用组件
import { GapTable } from 'ctj-ui-next'
import {
  ControlType,
  tableViewConfig,
  pageConfig,
  DataItem,
  columnItem,
  opeColumnItem,
  configData,
  Units,
} from 'ctj-ui-next/lib/index'
const tableRef = ref()
const tableColumns = ref<columnItem[]>([
  {
    title: '指标名称',
    dataIndex: 'monetaryAll',
    key: 'monetaryAll',
    width: 200,
    configs: {
      disabled: false,
    },
  },
  {
    title: '测试自定义列',
    customEllipsis: true,
    control_type: ControlType.render,
    dataIndex: 'forewarning',
    key: 'forewarning',
    width: 200,
    configs: {
      cusRender: (record: any) => {
        const level = record.forewarning || 0
        const levelColor: any = {
          1: '#faad14',
          2: '#52c41a',
          3: '#ff4d4f',
        }
        return h(AlertFilled, {
          style: 'font-size:20px;color:' + (levelColor[level] || '#52c41a'),
        })
      },
    },
  },
  {
    title: '收款人',
    dataIndex: 'payee_user_name',
    key: 'payee_user_name',
    width: 150,
    control_type: ControlType.input,
    configs: {
      disabled: false,
    },
  },
  {
    title: '操作',
    dataIndex: 'operation',
    key: 'operation',
    control_type: ControlType.operation,
    operateConfigs: {
      delete: {
        disabledCondition: (record: any) => {
          if (record.status == 0) {
            return true
          } else {
            return false
          }
        },
      },
      cancel: {
        disabledCondition: (record: any) => {
          if (record.status == 1) {
            return true
          } else {
            return false
          }
        },
      },
      punish: {
        disabledCondition: (record: any) => {
          if (record.status == 0) {
            return true
          } else {
            return false
          }
        },
      },
    },
    opeColums: [
      {
        type: 'delete',
        title: '删除',
        key: 'delete',
      },
      {
        type: 'edit',
        title: '编辑',
        key: 'edit',
      },
      {
        type: 'punish',
        title: '发布',
        key: 'punish',
      },
      {
        type: 'cancel',
        title: '撤销发布',
        key: 'cancel',
      },
    ],
  },
])
const dataSource = ref<DataItem[]>([
  {
    forewarning: 0,
    id: '1',
    status: 0,
    pay_money: 34,
  },
  {
    forewarning: 1,
    id: '2',
    status: 1,
    pay_money: 56,
  },
  {
    forewarning: 2,
    is: '3',
    status: 0,
    pay_money: 34,
  },
  {
    forewarning: 3,
    id: '4',
    status: 1,
    pay_money: 34,
  },
])
const configData = ref<configData>({
  viewConfig: <tableViewConfig>{
    rowKey: 'id',
    bordered: true,
    isHeight: true,
    checkType: 'checkbox',
  },
  cusPagination: <pageConfig>{
    current: 1,
    pageSize: 20,
    total: 4,
  },
  footerConfig: {
    totalSum: {
      titleKey: 'monetaryAll',
      title: '总计',
      data: {
        pay_money: 158,
      },
    },
    checkedSum: {
      title: '选中合计',
      titleKey: 'monetaryAll',
      totalKey: ['pay_money'],
    },
    customFooter: {
      titleKey: 'monetaryAll',
      title: '收款',
      data: {
        pay_money: 4400,
      },
    },
  },
})
let selectData: any = ref([])

//页码切换
const pageChange = (page: number, pageSize: number) => {}

//右侧操作列操作按钮
const handleOperate = (code: string, record: DataItem, index: number) => {}

//多选
const handleSelection = (selectedRows: DataItem[]) => {}

//清除选中项
const clearCheckData = () => {
  tableRef.value.clearSelected()
}

//表格行展开事件
const onExpand = (expanded: boolean, record: any) => {}
</script>
<style lang="less" scoped>
#app {
  padding: 8px;
  background-color: #fff;
}
</style>
<template>
  <div id="app">
    <a-button @click="clearCheckData">清空选中项</a-button>
    <GapTable
      ref="tableRef"
      :columns="tableColumns"
      :dataSource="dataSource"
      @page-change="pageChange"
      @operate="handleOperate"
      :config-data="configData"
      @handleSelection="handleSelection"
      :unit-config="{ defaultVal: Units.tenThousand }"
      @on-expand="onExpand"
    >
      <template #customEllipsis="{ column, record }">
        <div v-if="column.dataIndex == 'forewarning'">
          {{ record.forewarning == 3 ? '超期' : record.forewarning == 1 ? '待付' : '正常' }}
        </div>
      </template>
      <template #expandedRowRender="{ record, index, indent, expanded }">
        <p>{{ record }}{{ index }}</p>
        <p>indent{{ indent }}</p>
        <p>expanded{{ expanded }}</p>
      </template>
    </GapTable>
  </div>
</template>
<script lang="ts" setup>
import { ref, h } from 'vue'
import { AlertFilled } from '@ant-design/icons-vue'
// 引用组件
import { GapTable } from 'ctj-ui-next'
import {
  ControlType,
  tableViewConfig,
  pageConfig,
  DataItem,
  columnItem,
  opeColumnItem,
  configData,
  Units,
} from 'ctj-ui-next/lib/index'
const tableRef = ref()
const tableColumns = ref<columnItem[]>([
  {
    title: '指标名称',
    dataIndex: 'monetaryAll',
    key: 'monetaryAll',
    width: 200,
    configs: {
      disabled: false,
    },
  },
  {
    title: '测试自定义列',
    customEllipsis: true,
    control_type: ControlType.render,
    dataIndex: 'forewarning',
    key: 'forewarning',
    width: 200,
    configs: {
      cusRender: (record: any) => {
        const level = record.forewarning || 0
        const levelColor: any = {
          1: '#faad14',
          2: '#52c41a',
          3: '#ff4d4f',
        }
        return h(AlertFilled, {
          style: 'font-size:20px;color:' + (levelColor[level] || '#52c41a'),
        })
      },
    },
  },
  {
    title: '收款人',
    dataIndex: 'payee_user_name',
    key: 'payee_user_name',
    width: 150,
    control_type: ControlType.input,
    configs: {
      disabled: false,
    },
  },
  {
    title: '操作',
    dataIndex: 'operation',
    key: 'operation',
    control_type: ControlType.operation,
    operateConfigs: {
      delete: {
        disabledCondition: (record: any) => {
          if (record.status == 0) {
            return true
          } else {
            return false
          }
        },
      },
      cancel: {
        disabledCondition: (record: any) => {
          if (record.status == 1) {
            return true
          } else {
            return false
          }
        },
      },
      punish: {
        disabledCondition: (record: any) => {
          if (record.status == 0) {
            return true
          } else {
            return false
          }
        },
      },
    },
    opeColums: [
      {
        type: 'delete',
        title: '删除',
        key: 'delete',
      },
      {
        type: 'edit',
        title: '编辑',
        key: 'edit',
      },
      {
        type: 'punish',
        title: '发布',
        key: 'punish',
      },
      {
        type: 'cancel',
        title: '撤销发布',
        key: 'cancel',
      },
    ],
  },
])
const dataSource = ref<DataItem[]>([
  {
    forewarning: 0,
    id: '1',
    status: 0,
    pay_money: 34,
  },
  {
    forewarning: 1,
    id: '2',
    status: 1,
    pay_money: 56,
  },
  {
    forewarning: 2,
    is: '3',
    status: 0,
    pay_money: 34,
  },
  {
    forewarning: 3,
    id: '4',
    status: 1,
    pay_money: 34,
  },
])
const configData = ref<configData>({
  viewConfig: <tableViewConfig>{
    rowKey: 'id',
    bordered: true,
    isHeight: true,
    checkType: 'checkbox',
  },
  cusPagination: <pageConfig>{
    current: 1,
    pageSize: 20,
    total: 4,
  },
  footerConfig: {
    totalSum: {
      titleKey: 'monetaryAll',
      title: '总计',
      data: {
        pay_money: 158,
      },
    },
    checkedSum: {
      title: '选中合计',
      titleKey: 'monetaryAll',
      totalKey: ['pay_money'],
    },
    customFooter: {
      titleKey: 'monetaryAll',
      title: '收款',
      data: {
        pay_money: 4400,
      },
    },
  },
})
let selectData: any = ref([])

//页码切换
const pageChange = (page: number, pageSize: number) => {}

//右侧操作列操作按钮
const handleOperate = (code: string, record: DataItem, index: number) => {}

//多选
const handleSelection = (selectedRows: DataItem[]) => {}

//清除选中项
const clearCheckData = () => {
  tableRef.value.clearSelected()
}

//表格行展开事件
const onExpand = (expanded: boolean, record: any) => {}
</script>
<style lang="less" scoped>
#app {
  padding: 8px;
  background-color: #fff;
}
</style>

属性 Props

参数说明类型参数说明是否必传
columns表格列columnItem[]参考columns 说明
dataSource表格数据DataItem[][]
configData表格基础配置configData参考configData 说明
eleDataObj可编辑单元格为 Select 或 TreeSelect 时的下拉数据Record<string, any>{ 字典code或字段名:下拉数据 }
unitConfig表格金额展示格式化需要保留的金额位数,默认按照单位为元时格式化,保留两位小数 {defaultVal: Units}参考Units

事件 Events

事件名说明回调参数参数说明
operate列表行内操作按钮事件(code: string, record: DataItem, index: number)code 当前按钮编码 / record 当前行数据 / index 当前行序号
pageChange页码或者当前页显示条数变更(page: number, pageSize: number)page 当前页码 / pageSize 每页显示条数
handleSelection列表单选或多选选中数据变更(selectedRows: array)单选或多选的选中项
handleItemClick单元格单击事件(record: DataItem, rowIndex: number, column: columnItem)record 当前行数据 / rowIndex 当前行序号 / column 当前列
onExpand行展开时触发(expanded: boolean, record: any)expanded 是否展开 / record 展开的行的数据
tableFormChange表格可编辑时单元格内容change事件({value, column, index, record})value 当前值 / record 当前行数据 / index 当前行序号 / column 当前列

方法 Methods

方法名称说明
clearSelected清空表格选中项

插槽 Slots

插槽名称说明参数
customEllipsis{column 当前列配置信息,record 当前行数据}
expandedRowRender{record 当前行数据, index 当前行序号, indent 缩进距离, expanded 当前行展开状态}

参数说明

columns 说明

属性名说明类型可选值
title对应列显示的标题String
dataIndex对应列字段名String
align列对齐方式String'center' / 'left' / 'right'
control_type可编辑单元格组件Control_Type参考Control_Type
configs可编辑单元格内组件配置信息columnConfigs参考columnConfigs 说明
opeColums操作列按钮opeColumnItem[]参考opeColumnItem 说明
data_type数据类型(针对金额格式化,其余类型暂不做处理)DataType参考DataType,只对 money 和 minusMoney 类型做了格式化处理
customRender生成复杂数据的渲染函数Function({text, record, index, column}) {}
visible当前列是否显示Booleantrue / false
moreText操作列更多按钮现显示文字String默认“更多”
maxLength操作列按钮超过几个显示更多Number默认 3 个
ele_code可编辑单元格为 Select 或 TreeSelect 时的下拉字典 codeString''
resizable是否支持可拖拽调整宽度Booleantrue / false,默认 true
customEllipsis是否需要自定义插槽显示气泡卡片Booleantrue / false,默认 false
opeShowType操作列按钮根据传入的禁用方法处理按钮在当前行的显隐或是否禁用状态类型OpeControlType参考OpeControlType,默认 hide
operateConfigs操作列按钮相关配置信息[x: string]: {disabledCondition?: Function}disabledCondition 单个按钮在满足该条件时禁用或隐藏
isClick操作列是否可点击Booleantrue / false
jump_group_id操作列点击可配置跳转视图的视图idString''

备注:其余属性可参考Ant Design Vue Table

configData 说明

属性名说明类型参数说明是否必传
viewConfig基础配置tableViewConfig参考viewConfig 说明
footerConfig合计行配置summarys{ totalSum: 参考totalSum 总计说明 , checkedSum: 参考checkedSum 勾选合计说明 , customFooter: 参考customFooter 自定义底部数据说明}
cusPagination页码配置pageConfig{pageSize: 每页显示条数, current: 当前页码, total: 数据条数}

columnConfigs 说明

属性名说明类型参数说明是否必传
disabled组件是否禁用Booleantrue / false
maxlength最大长度number
showCount是否展示字数booleantrue / false
maxinputNumber 组件可输入的最大值number
mininputNumber 组件可输入的最小值number
precision数值精度number
allowClear可以点击清除图标删除内容booleantrue / false
fieldNames自定义节点 label、value、options 的字段object{ label: label, value: value, options: options }
showBtninput 组件是否显示右侧选择按钮booleantrue / false
chooseModalinput 组件右侧选择按钮单击事件Function(record: object, index: number, column: object)record 当前行数据 / index 行序号 / column 当前列配置信息
picker日期选择器类型PickerModedate / week / month / quarter / year
format日期组件显示格式化formatType参考dayjs
showTime日期组件是否显示时分秒booleantrue / false
mode设置 Select 的模式为多选或标签'multiple' / 'tags' / 'SECRET_COMBOBOX_MODE_DO_NOT_USE' / undefined
placeholder输入框提示文字string
controlsinputNumber 组件是否显示增减按钮booleantrue / false
optionsDataselect 或者 treeSelect 的下拉框数据Array
formatter自定义渲染函数(可以为 html)(record)=>{}--
align组件类型为 InputNumber 时数值对齐方式string'right' / 'left' / 'center',默认'left'
isAllCheck组件类型为 CheckBox 时是否需要全选booleantrue / false,默认 false
buttonStyle组件类型为 Radio 时的显示类型string'Radio' / 'RadioButton',默认'Radio'
showType组件类型为 Radio 且显示类型为 RadioButton 时的组件样式,描边或填色string'outline' / 'solid',默认'outline'
className给组件添加 class 属性string

opeColumnItem 说明

属性名说明类型参数说明是否必传
title按钮名称String''
key按钮标识String''
type按钮类型String''

viewConfig 说明

属性名说明类型参数说明是否必传
bordered是否有边框Booleantrue / false
checkType是否需要选择,单选或者多选String'' / 'checkbox' / 'radio',注意:checkType和rowSelection只能选其一
showIndex是否显示序号列Booleantrue / false
rowKey表格行 key 的取值,可以是字符串或一个函数Function(record):string'key'
isShowHeader是否显示页头Booleantrue / false(可通过 slot 插槽设置页头)
isHeight内容区域的高度是否动态计算Booleantrue / false,默认 true
scroll是否可滚动,也可以指定滚动区域的宽、高Object{y: scrollHeight, x: '100%'}
selectedKeys可选择表格的默认选中项ArrayrowKey 组成的数组
isDrag表格行是否支持拖拽Booleantrue / false(默认false)

备注:其余属性可参考Surely Vue Table

totalSum 总计说明

属性名类型说明可选值
titleString总计 title
titleKeyString总计 title 在哪列显示当前表格的所有 dataIndex
dataObject总计数据(由于需要跨页计算全部数据总计,数据需后台返回)

checkedSum 勾选合计说明

属性名类型说明可选值
titleString合计 title
titleKeyString合计 title 在哪列显示当前表格的所有 dataIndex
totalKeyString需要计算合计的列(当前仅支持单项)当前表格的所有 dataIndex

customFooter 自定义底部数据说明

属性名类型说明可选值是否必传
titleString自定义底部 title
titleKeyString自定义底部 title 在哪列显示当前表格的所有 dataIndex
dataDataItem要展示的数据

Demo

表格列显示自定义组件

  1. column 的 control_type 配置成 'Render'
  2. 在 configs 里写 cusRender 函数(必须使用 vue 的 h 函数写)
import { Progress } from 'ant-design-vue'
const tableColumns: columnItem[] = [
  {
    title: '金额',
    dataIndex: 'pay_money',
    align: 'right',
    control_type: 'Render',
    configs: {
       cusRender: (record) => {
          return h(Progress, { percent: Number(record.pay_money || 0) })
        },
    },
  },
]
import { Progress } from 'ant-design-vue'
const tableColumns: columnItem[] = [
  {
    title: '金额',
    dataIndex: 'pay_money',
    align: 'right',
    control_type: 'Render',
    configs: {
       cusRender: (record) => {
          return h(Progress, { percent: Number(record.pay_money || 0) })
        },
    },
  },
]

表格列显示自定义气泡提示

  1. column 对应列 加上 customEllipsis 属性
const tableColumns: columnItem[] = [
  {
    title: '金额',
    dataIndex: 'pay_money',
    align: 'right',
    customEllipsis: true,
  },
]
const tableColumns: columnItem[] = [
  {
    title: '金额',
    dataIndex: 'pay_money',
    align: 'right',
    customEllipsis: true,
  },
]
  1. 组件那自定义气泡内容插槽,插槽名称 customEllipsis,内容写的时候需要判断一下 column 是否是需要显示气泡的列如果不写插槽,默认是显示当前文本
<GapTable
  ref="tableRef"
  :columns="tableColumns"
  :dataSource="dataSource"
  @page-change="pageChange"
  @operate="handleOperate"
  :config-data="configData"
  @handleSelection="handleSelection"
>
 <template #customEllipsis="scope">
    <div>
      <div v-if="scope?.column?.dataIndex === 'bill_status_display'">
        bill_status_display_test
      </div>
    </div>
  </template>
</GapTable>
<GapTable
  ref="tableRef"
  :columns="tableColumns"
  :dataSource="dataSource"
  @page-change="pageChange"
  @operate="handleOperate"
  :config-data="configData"
  @handleSelection="handleSelection"
>
 <template #customEllipsis="scope">
    <div>
      <div v-if="scope?.column?.dataIndex === 'bill_status_display'">
        bill_status_display_test
      </div>
    </div>
  </template>
</GapTable>

预算单位软件产品开发部