Skip to content

Data Table 数据表格

该组件用于快速生成数据表格,内部封装了表格渲染、文件处理等逻辑,只需传入datafields属性即可。

全局配置

在全局配置组件属性。

DataTable组件属性配置
ts
app.provide(DATA_TABLE_KEY, {
  showButtonCount: 3,
  border: false,
  stripe: true,
  // others props...
});

业务注入

在全局注入权限校验和处理文件业务。

权限校验业务注入
ts
// 假设当前登录用户拥有以下权限标识
const authoritys = ['docAdmin'];
app.provide(CHECK_AUTHORITY_KEY, authority => authoritys.includes(authority));
注入处理文件地址业务
ts
app.provide(HANDLE_FILE_URLS_KEY, urls => {
  return (
    urls
      ?.split(',')
      ?.map(
        url =>
          `${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url}`,
      ) ?? []
  );
});
注入处理缩略图地址业务
ts
app.provide(HANDLE_THUMB_URLS_KEY, urls => {
  return (
    urls?.split(',')?.map(url => {
      const fileSuffix = url.split('.').pop();
      return `${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url.replace(
        '.' + fileSuffix,
        '_thumb.' + fileSuffix,
      )}`;
    }) ?? []
  );
});

基础用法

组件内部默认开启了show-overflow-tooltip属性,当分配的宽度不足以单行显示时,会自动省略多余内容,并在鼠标悬停时显示tooltip。表格内图片默认开启了懒加载功能,只有滚动到对应位置才会加载图片。表格内图片和悬停预览默认展示缩略图,点击全屏预览会加载原图进行展示。

操作按钮

表格内部封装了详情、编辑、删除三个常用按钮,默认fixed在表单最右侧,监听相应事件后自动渲染,默认不渲染。

自定义按钮

除了使用组件内部封装好的按钮,你还可以通过buttons属性传入自定义按钮,超过三个自动折叠,更多按钮属性请查看DataTableButton

权限校验

表格内部封装了权限校验逻辑,使用前需要在全局注入权限校验相关方法。内置按钮可以通过()设置权限标识,多个权限标识用|分隔。字段配置项和自定义按钮可以通过authority属性设置权限标识。如果权限标识校验没有通过,则对应的内容不会被渲染。

格式化内容

通过传入formatter属性可以对表格项的内容进行格式化处理。

加密表格列2.1.0

组件提供了加密表格项对数据进行加密展示,通过传入解密逻辑可以实现表格项的解密查看功能。

提示

加密表单项功能内部基于Verify组件实现,使用前需要在全局配置好验证码组件的相关属性。

特殊表格列

为了更方便的在表格中使用标签、按钮、开关等组件,组件内部对这些组件的部分属性进行了重写和扩展。

标签列

ElTagtype属性进行了重写。

按钮列

扩展了name属性并对ElButtontype属性和click事件进行了重写。

开关列

ElSwitchbeforeChange属性和onChange事件进行了重写。

自定义表格列

通过设置fieldTypeslot,你可以自定义表格列的内容。

属性&事件&插槽透传

Data Table基于ElTable封装,所以你可以传入ElTable的所有属性和事件,并且在字段配置属性fields中,根据fieldType的不同,你可以透传属性和事件给对应的渲染组件,具体fieldType对应的渲染组件请查看fieldType可选值

属性

属性名说明类型默认值
data表格数据T[][]
fields表格字段配置项集合DataTableFields<T>[]
buttons右侧操作列按钮DataTableButtons<T>[]
show-button-count右侧操作列按钮的个数 number3

DataTableField

属性名说明类型默认值
prop字段名称 string
fieldType表格列字段类型TableColumnFieldType
authority权限标识string / string[]

除了上述属性,你还可以透传对应渲染组件的所有属性和事件。

fieldType值对应渲染组件

字段类型说明对应的渲染组件
text文本
ciphertext2.1.0加密文本LivVerify
button按钮ElButton
switch开关ElSwitch
tag标签ElTag
image图片ElImage
qrcode二维码LivQrCode
slot插槽

DataTableButton

属性名说明类型默认值
name按钮名称string
authority按钮权限string / string[]
order按钮顺序 number
show是否显示按钮boolean / Functiontrue
onClick按钮点击事件Function

除了上述属性,你还可以透传ElButton的所有属性和事件。

事件

事件名说明类型
detail点击详情按钮时触发Function
edit点击编辑按钮时触发Function
delete点击删除按钮时触发Function
类型声明
ts
import type { MaybeRef } from 'vue';
import type { ComponentExposed } from 'vue-component-type-helpers';
import type {
  TableProps as ElTableProps,
  ButtonProps as ElButtonProps,
  ImageProps as ElImageProps,
  SwitchProps as ElSwitchProps,
  TableColumnCtx as ElTableColumnCtx,
  TagProps as ElTagProps,
} from 'element-plus';
import type { QrCodeProps } from '../../qr-code';
import DataTable from './data-table.vue';
import { Writable } from 'element-plus/es/utils';
import { VerifyProps, VerifyResult } from '../../verify';

/**
 * 表格组件属性
 * @template T 表格的数据类型
 */
export interface DataTableProps<T = Record<string | number | symbol, any>> {
  /**
   * 表格数据
   * @template T 表格的数据类型
   */
  data?: T[];
  /**
   * 表格字段配置项集合
   * @template T 表格的数据类型
   */
  fields: DataTableFields<T>;
  /**
   * 右侧操作列按钮
   * @template T 表格的数据类型
   * @defaultValue []
   */
  buttons?: DataTableButtons<T>;
  /**
   * 右侧操作列展示按钮的个数
   * @remarks 超过的按钮会隐藏并显示展开图标
   * @defaultValue 3
   */
  showButtonCount?: number;
  /**
   * 右侧操作栏详情按钮点击事件
   * @remarks 传入该属性后会自动渲染详情按钮
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   */
  onDetail?: (row: T, index: number) => void;
  /**
   * 右侧操作栏编辑按钮点击事件
   * @remarks 传入该属性后会自动渲染编辑按钮
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   */
  onEdit?: (row: T, index: number) => void;
  /**
   * 右侧操作栏删除按钮点击事件
   * @remarks 传入该属性后会自动渲染删除按钮
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   */
  onDelete?: (row: T, index: number) => void;
}

/**
 * 数据表格组件实例
 * @template T 表格的数据类型
 */
export type DataTableInstance<
  T extends Record<string | number | symbol, any> = Record<string | number | symbol, any>,
> = ComponentExposed<typeof DataTable<T>>;

/**
 * 表格列字段类型
 */
export type TableColumnFieldType =
  | 'text'
  | 'ciphertext'
  | 'button'
  | 'switch'
  | 'tag'
  | 'image'
  | 'qrcode'
  | 'slot';

/**
 * 表格字段配置项
 * @template T 表格的数据类型
 */
export type DataTableField<T = Record<string | number | symbol, any>> =
  | TextTableColumnField<T>
  | CiphertextTableColumnField<T>
  | ButtonTableColumnField<T>
  | SwitchTableColumnField<T>
  | TagTableColumnField<T>
  | ImageTableColumnField<T>
  | QRCodeTableColumnField<T>
  | SlotTableColumnField<T>;

/**
 * 表格字段配置项集合
 * @template T 表格的数据类型
 */
export type DataTableFields<T = Record<string | number | symbol, any>> = MaybeRef<
  DataTableField<T>
>[];

/**
 * 表格右侧列操作按钮
 * @template T 表格的数据类型
 */
export interface DataTableButton<T = Record<string | number | symbol, any>>
  extends Partial<ElButtonProps> {
  /**
   * 按钮名称
   */
  name?: string;
  /**
   * 是否显示按钮
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   */
  show?: boolean | ((row: T, index: number) => boolean);
  /**
   * 按钮权限
   */
  authority?: string | string[];
  /**
   * 展示顺序
   * @remarks 组件内置的详情、编辑、删除按钮order分别为10、20、30,如果想要让自定义按钮显示在详情和编辑按钮之间,order可以设置为10~20之间,如果不设置order则默认展示在内置按钮后面。
   */
  order?: number;
  /**
   * 按钮点击事件
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   */
  onClick?: (row: T, index: number) => void;
}

/**
 * 表格右侧列操作按钮集合
 * @template T 表格的数据类型
 */
export type DataTableButtons<T = Record<string | number | symbol, any>> = DataTableButton<T>[];

/**
 * 表格插槽作用域数据
 * @template T 表格的数据类型
 */
export type DataTableScope<T = Record<string | number | symbol, any>> = {
  /**
   * 当前行的索引
   */
  $index: number;
  /**
   * 当前行数据
   */
  row: T;
  /**
   * 当前列的上下文
   * @template T 表格的数据类型
   */
  column: ElTableColumnCtx<T>;
};

/**
 * 表格列基类
 * @template T 表格的数据类型
 */
interface TableColumnField<T> extends Partial<Omit<ElTableColumnCtx<T>, 'prop'>> {
  /**
   * 字段名称,对应列内容的字段名
   */
  prop: string;
  /**
   * 表格列类型
   */
  type?: 'default' | 'selection' | 'index' | 'expand';
  /**
   * 表格列字段类型
   */
  fieldType?: TableColumnFieldType;
  /**
   * 权限标识
   */
  authority?: string | string[];
}

/**
 * 文本表格列
 * @template T 表格的数据类型
 */
export type TextTableColumnField<T> = Omit<Omit<TableColumnField<T>, 'fieldType'>, 'prop'> & {
  /**
   * 表格列类型为selection、index、expand时,允许不设置prop属性
   */
  prop?: string;
  /**
   * 文本字段
   */
  fieldType?: 'text';
};

/**
 * 加密文本表格列
 * @template T 表格的数据类型
 */
export type CiphertextTableColumnField<T> = Omit<Omit<TableColumnField<T>, 'fieldType'>, 'type'> &
  VerifyProps & {
    /**
     * @remarks 加密文本类型
     */
    fieldType?: 'ciphertext';
    /**
     * 解密方法
     * @param params 验证成功后返回的参数
     * @param row 行数据
     * @returns 解密后的文本
     */
    decrypt: (params: VerifyResult, row: T) => string | Promise<string>;
  };

/**
 * 按钮类型
 */
type ButtonType = 'success' | 'warning' | 'info' | 'primary' | 'danger';

/**
 * 按钮表格列
 * @template T 表格的数据类型
 */
export type ButtonTableColumnField<T> = Omit<
  Omit<TableColumnField<T>, 'fieldType'> & Partial<Writable<ElButtonProps>>,
  'type'
> & {
  /**
   * @remarks 按钮类型,内部实现为[el-button](https://element-plus.org/zh-CN/component/button.html)组件,可以透传[el-button的所有属性](https://element-plus.org/zh-CN/component/button.html#button-%E5%B1%9E%E6%80%A7)。
   */
  fieldType: 'button';
  /**
   * 按钮名称
   */
  name?: string;
  /**
   * 按钮的类型
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   * @param cellValue 列数据
   * @returns { ButtonType } 按钮的类型
   */
  type?: ButtonType | ((row: T, index: number, cellValue: T[keyof T]) => ButtonType);
  /**
   * 按钮点击的回调函数
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   * @param cellValue 列数据
   * @returns { void | Promise<any> } 如果返回`Promise`则会自动给按钮加上`loading`状态,并在执行完成后移除loading状态
   */
  onClick?: (row: T, index: number, cellValue: T[keyof T]) => void | Promise<any>;
};

/**
 * 开关表格列
 * @template T 表格的数据类型
 */
export type SwitchTableColumnField<T> = Omit<TableColumnField<T>, 'fieldType'> &
  Partial<Writable<Omit<ElSwitchProps, 'onChange' | 'beforeChange'>>> & {
    /**
     * @remarks 开关类型
     */
    fieldType: 'switch';
    /**
     * 开关状态切换后的回调函数
     * @template T 表格的数据类型
     * @param value 开关绑定值
     * @param row 行数据
     * @param index 数据索引
     * @param cellValue 列数据
     */
    onChange?: (
      value: string | number | boolean,
      row: T,
      index: number,
      cellValue: T[keyof T],
    ) => void;
    /**
     * 开关状态切换前的回调函数
     * @template T 表格的数据类型
     * @param row 行数据
     * @param index 数据索引
     * @param cellValue 列数据
     * @returns { boolean | Promise<any> } 返回`false`或者返回`Promise`且被`reject`则停止切换
     */
    beforeChange?: (row: T, index: number, cellValue: T[keyof T]) => boolean | Promise<any>;
  };

/**
 * 标签类型
 */
type TagType = 'success' | 'warning' | 'info' | 'primary' | 'danger';

/**
 * 标签表格列
 * @template T 表格的数据类型
 */
export type TagTableColumnField<T> = Omit<
  Omit<TableColumnField<T>, 'fieldType'> & Partial<Writable<ElTagProps>>,
  'type'
> & {
  /**
   * @remarks 标签类型
   */
  fieldType: 'tag';
  /**
   * 标签的类型
   * @template T 表格的数据类型
   * @param row 行数据
   * @param index 数据索引
   * @param cellValue 列数据
   * @returns { TagType } 标签的类型
   */
  type?: TagType | ((row: T, index: number, cellValue: T[keyof T]) => TagType);
};

/**
 * 图片表格列
 * @template T 表格的数据类型
 */
export type ImageTableColumnField<T> = Omit<TableColumnField<T>, 'fieldType'> &
  Partial<Writable<ElImageProps>> & {
    /**
     * @remarks 图片类型
     */
    fieldType: 'image';
  };

/**
 * 二维码表格列
 * @template T 表格的数据类型
 */
export type QRCodeTableColumnField<T> = Omit<TableColumnField<T>, 'fieldType'> &
  Partial<QrCodeProps> & {
    /**
     * @remarks 二维码类型
     */
    fieldType: 'qrcode';
  };

/**
 * 插槽表格列
 * @template T 表格的数据类型
 */
export type SlotTableColumnField<T> = Omit<TableColumnField<T>, 'fieldType'> & {
  /**
   * @remarks 插槽类型
   */
  fieldType: 'slot';
};

/**
 * 数据表格组件包含透传属性在内的全部属性
 * @template T 表格的数据类型
 */
export type DataTableFullProps<T> = Partial<ElTableProps<T> & DataTableProps<T>>;