type
status
date
slug
summary
tags
category
icon
password
如以下两图所示,封装的表格具有输入框列、tag标签列、时间列、超链接列、图片展示列、switch开关列、选择框列、操作栏以及普通文本展示列,按需配置即可。
封装目的:风格统一,减少开发量。


📝 主要代码
一.表格主体
ref="tableRef"
:为这个表格组件设置一个引用,方便在脚本部分通过this.$refs.tableRef
访问。
:data="data"
:绑定表格的数据源,data
是一个数组。
:default-sort="defaultSort"
:设置表格的默认排序方式。
:class="{ 'empty-table': data.length === 0 }"
:根据data
数组的长度动态添加empty-table
类,当数据为空时应用这个类。
row-key="date"
:指定每行数据的唯一键为date
。
width="100%"
和max-height="540"
:设置表格的宽度和最大高度。
@selection-change="handleSelectionChange"
、@sort-change="handleSortChange"
、@filter-change="handleFilterChange"
和@row-click="handleRowClick"
:这些是表格的事件监听器,分别处理选择变化、排序变化、过滤变化和行点击事件。
动态组件
<component>
,它使用 :is="componentData[item.type]"
动态选择组件类型,并通过 v-for
指令遍历 paramsFormat
数组,为每个 item
渲染一个组件。每个组件都有一个唯一的 key
,由 item.type
和 index
组合而成,并且传递了 item
作为 params
属性。组件还绑定了一个 @row-change="handleRowChange"
事件监听器。1. const componentData = markRaw<any>({});
这行代码使用
markRaw
函数创建了一个空对象 componentData
,并且这个对象不会被 Vue 的响应式系统追踪。markRaw
通常用于存储不需要响应式的数据。2. const modules: any = import.meta.glob("./fragment/*.vue");
这行代码使用 Vite 的
import.meta.glob
函数动态导入 ./fragment
目录下的所有 .vue
文件,并将这些模块存储在 modules
对象中。modules
的键是文件路径,值是导入的模块。3. for (const path in modules) { ... }
这个循环遍历
modules
对象的每一个键(文件路径),并对每个模块进行处理。3.1 const componentName = path.replace(/^\.\/fragment\/(.*)\.vue$/, "$1");
这行代码使用正则表达式从文件路径中提取组件名称。例如,
./fragment/MyComponent.vue
会被转换为 MyComponent
。3.2 componentData[componentName] = defineAsyncComponent(modules[path]);
这行代码使用
defineAsyncComponent
函数将模块定义为异步组件,并将其存储在 componentData
对象中,以组件名称为键。- 功能:对
props.params
进行映射,生成一个新的数组,每个元素包含一些默认属性(如fixed
,sort
,defaultSort
,filter
)和filterList
。
- 步骤:
- 遍历
props.params
。 - 如果元素的
type
属于complexTypes
,则处理其filterList
属性。 - 将处理后的
filterList
和一些默认属性合并到元素中,返回新的对象。
- 返回值:一个新的数组,每个元素包含处理后的属性
排序
- 功能:初始化
defaultSort
,并根据formItemFull
的结果设置其值。
- 步骤:
- 定义一个
ref
类型的defaultSort
,初始值为undefined
。 - 从
formItemFull
的结果中过滤出sort
和defaultSort
属性都为true
的第一个元素。 - 如果找到了这样的元素,则根据其
defaultSort
属性设置defaultSort.value
,order
默认为"ascending"
。
二.各列封装
二——一 时间栏
二——二 tag栏
columnFromat
:根据param
的配置格式化列的显示内容。- 如果
param
有unit
属性,返回带单位的值。 - 如果
param
有paramList
属性,查找匹配的项并返回其text
属性。 - 否则,返回原始值。
typeFormat
:根据param
的配置确定标签的类型。- 查找
paramList
中匹配的项并返回其type
属性。
二——三 switch开关栏
二——四 超链接栏
插槽中,使用
<a>
标签来创建链接,链接地址是scope.row.domain
,即表格行数据中的domain
属性。链接的文本内容是通过调用columnFromat
函数来生成的,该函数接受两个参数:scope.row
表示当前行的数据,params
表示props
中的params
属性。columnFromat
的函数,它接受两个参数row
和param
。这个函数根据param
的不同,对row[param.paramKey]
进行格式化,并返回格式化后的结果。如果param
中有unit
属性,那么将单位添加到值的后面;如果param
中有paramList
属性,那么根据值在paramList
中查找对应的文本;否则,直接返回原始值。总结一下,该组件用于渲染一个带有链接的表格列。它接受一个名为
params
的属性,根据params
的不同对表格列的内容进行格式化,并生成一个带有链接的文本。