ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

beekeeper-studio UI Kit Table 组件实战指南:`bks-table` 的数据渲染、键标记、编辑与右键菜单定制

beekeeper-studio UI Kit Table 组件实战指南:`bks-table` 的数据渲染、键标记、编辑与右键菜单定制 beekeeper-studio UI Kit Table 组件实战指南bks-table的数据渲染、键标记、编辑与右键菜单定制【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studiobks-table是 beekeeper-studio 开源仓库中beekeeperstudio/ui-kit组件库的核心表格组件它基于 Tabulator 封装以电子表格式的交互方式展示数据库表数据支持行/列区域选择、主键与外键标记、单元格编辑、排序和右键菜单扩展。阅读本文后你将掌握bks-table的完整接入方式、列定义与全部属性/事件 API并能够通过 CSS 变量与自定义菜单项将其深度集成进自己的数据库类应用界面。组件定位与适用场景Table 组件专门解决把数据库表的数据以表格形式展示出来并让用户像操作电子表格一样选择、排序、编辑这一核心诉求。它作为自定义元素Custom Element对外暴露标签名为bks-table是 Getting Started 文档所介绍的五类组件Table、Entity List、Text Editor、SQL Text Editor、Data Editor之一而 Data Editor 组件正是通过tableProps把 Table 组件与其他编辑器组合在一起。从源码结构看Table 组件由三部分组成apps/ui-kit/lib/components/table/Table.vue组件实现、apps/ui-kit/lib/components/table/table.tsprops 定义、apps/ui-kit/lib/components/table/define.ts注册自定义元素。其中 define.ts 通过customElements.define(bks-table, TableElement)完成注册这也是文档中所有示例都能直接使用bks-table标签的原因。快速上手安装与基本用法安装与引入在项目中安装beekeeperstudio/ui-kit并引入样式与组件npm install beekeeperstudio/ui-kitimport beekeeperstudio/ui-kit/style.css; // 按需引入 Table 组件 import beekeeperstudio/ui-kit/bks-table.js; // 或者一次性引入全部组件 import beekeeperstudio/ui-kit;基本用法在 HTML 中放置bks-table标签然后在 JavaScript 中通过属性property注入数据与列定义bks-table/bks-table script const table document.querySelector(bks-table); table.data [ { id: 1, name: John Doe }, { id: 2, name: Jane Smith }, ]; table.columns [{ field: id }, { field: name }]; /scriptdata是一个对象数组对象的键即列字段名columns描述列的结构与行为。需要注意data、columns这类复杂类型不能通过 HTML 属性attribute传递因为属性值只能是字符串必须通过 JavaScript 属性赋值。此外属性名使用kebab-case如read-only而 JS 属性名使用camelCase如readOnly这一点在 getting-started.md 中有明确说明。仓库自带的 HTML 示例 examples/html/main.js 演示了真实接入方式——从实体数据中取出列与数据直接赋值table.columns entities[0].columns; table.data entities[0].data;响应式更新由于 UI Kit 底层使用 Vue 构建组件对属性变化是响应式的table.data.push({ id: 3, name: Bob })与重新整体赋值table.data [...]都会触发视图更新。如果不想让传入的对象被套上响应式 getter/setter可以Object.freeze(data)后再赋值。核心属性Table 属性参考完整的属性定义见 Table API对应源码实现位于 table.ts属性名类型说明默认值namestring表格名称右键菜单复制操作中会用到tabledataobject[]表格数据对象数组键为列字段名[]columnsobject[]列定义数组详见下方列定义[]cellContextMenuItemsobject[]|function扩展单元格右键菜单undefinedrowContextMenuItemsobject[]|function扩展行右键菜单API 文档列出undefinedcolumnHeaderContextMenuItemsobject[]|function扩展列头右键菜单undefinedrowHeaderContextMenuItemsobject[]|function扩展行头右键菜单undefinedcornerHeaderContextMenuItemsobject[]|function扩展角头右键菜单undefinedtabulatorOptionsobject覆盖/扩展底层 Tabulator 选项undefined说明当前仓库源码 table.ts 中实际定义的右键菜单 props 为cellContextMenuItems、columnHeaderContextMenuItems、rowHeaderContextMenuItems、cornerHeaderContextMenuItems四个。除此之外源码 props 还暴露了若干面向高级场景的属性如tableId用于按 id 持久化列宽与列显隐、schema表所属 schema、hasFocus是否聚焦表格、preventRedraw/redrawState/reinitializeState控制重绘与重建、height表格高度、dialect数据库方言影响数据类型 mutator、rowHeaderOffset行头起始编号偏移默认 0、sorters外部控制排序、binaryEncoding二进制字段编码hex或base64默认hex。列定义Column Definition列对象是驱动整个表格渲染的关键完整字段见 Table API 列定义节类型定义见 types.ts名称类型说明默认值field必填string数据对象中对应的键—titlestring表头显示的标题缺省时使用fieldundefinededitableboolean该列是否可编辑falsedataTypestring列的数据类型undefinedcssClassstring应用到该列的 CSS 类undefinedsorterstring|none排序器none表示禁用排序仍显示排序图标并发出事件undefinedprimaryKeyboolean标记为主键列表头显示主键图标undefinedforeignKeyboolean标记为外键列行为类似primaryKeyundefinedgeneratedboolean标记为生成列行为类似primaryKeyundefinedtabulatorColumnDefinitionobject|function扩展底层 Tabulator 列定义传对象做浅合并传函数则以默认列定义为参数、由函数返回最终定义undefined在 Table.vue 中每个列对象会被转换成 Tabulator 的ColumnDefinitiontitle缺省时回退到fieldeditable为真时启用内置input编辑器dataType与dialect结合生成数据 mutator当列数超过 30 时自动采用更窄的列宽常量以应对大表源码见 Table.vue。默认情况下组件会根据首行数据自动猜测排序器只有显式设置sorter才会强制指定。主键、外键与生成列标记数据库表的核心元信息——主键、外键、生成列——在bks-table中以表头图标key 图标的形式直观呈现。table.columns [ { field: id, primaryKey: true, }, { field: userId, foreignKey: true, }, { field: createdAt, generated: true, }, ];从 Table.vue 的实现可以看到这些标记如何影响渲染generated列表头 tooltip 前缀显示[Generated]并追加generated-columnCSS 类foreignKey列追加foreign-keyCSS 类单元格中显示跳转按钮primaryKey列tooltip 追加[Primary Key]说明追加primary-keyCSS 类。你可以在示例主题文件 examples/html/custom-theme.css 中看到通过.tabulator-col.primary-key:before定制主键图标颜色的写法。监听外键跳转事件外键单元格内的跳转按钮被点击时组件会派发bks-foreign-key-go-to事件事件数据位于event.detailtable.addEventListener(bks-foreign-key-go-to, (event) { const { value, field, cell } event.detail; console.log(value, field, cell); });value外键字段的值field外键字段名cell对应的 TabulatorCellComponent。这一事件正是在 Table.vue 中通过fkOnClick回调触发this.$emit(bks-foreign-key-go-to, { value, field, cell })实现的。类型定义见 types.ts。在 Beekeeper Studio 的实际交互中该事件通常用于跳转到关联表对应行的导航。启用单元格编辑编辑能力按列开启将列的editable置为true即可让该列进入可编辑状态。table.columns [ { field: userId, editable: true, }, ];编辑由双击触发——tabulator.ts 中设置了editTriggerEvent: dblclick编辑器为内置的input输入框见 Table.vue。编辑过程中单元格会获得edited/edit-success/edit-error等状态类对应的视觉样式新增行绿色、删除行红色、错误行深色等定义在 table.scss 中。右键菜单扩展Table 组件的右键菜单不是独立暴露的组件而是内置于表格交互中。默认菜单由 menu.ts 中的copyActionsMenu复制/剪切等范围操作会携带当前表名与 schema、commonColumnMenu通用列头操作、resizeAllColumnsToFitContent与resizeAllColumnsToFixedWidth角头菜单中的自适应/固定列宽等组成。用数组替换默认菜单table.cellContextMenuItems [ { label: Copy, handler: (event, cell, menuItem) {}, }, { label: Cut, handler: (event, cell, menuItem) {}, }, { label: Delete, handler: (event, cell, menuItem) {}, }, ];用函数微调默认菜单传入函数可以基于默认菜单项按id定位做插入或删除// 在 range-copy 之后插入一个新菜单项 table.cellContextMenuItems (event, cell, items) { const index items.findLastIndex((item) item.id.includes(range-copy)); return items.toSpliced(index 1, 0, { name: Custom Action, handler: () console.log(Custom action executed!, cell), }); }; // 过滤掉不需要的默认项仅保留 range-copy table.cellContextMenuItems (event, cell, items) { return items.filter((item) item.id.includes(range-copy)); };上述扩展逻辑在 Table.vue 中由useCustomMenuItems(event, cell, defaultItems, this.cellContextMenuItems)完成合并同一机制也应用于列头、行头与角头菜单。自定义菜单项的结构菜单项类型见 Menu Item API最简单形式只需两个必填属性——label与handlerconst menuItem { label: Delete, handler(event, target, menuItem) {}, };属性类型说明默认值label必填string|{ html: string }菜单项文本支持原始 HTML仅在你信任来源时使用—handler必填function点击时执行的函数—idstring唯一标识函数式扩展时用于定位默认项undefinedclassstring自定义样式类undefinedshortcutstring|string[]键盘快捷键展示undefineddisabledboolean是否禁用falseitemsMenuItem[]子菜单项undefinedkeepOpenboolean点击后是否保持菜单打开false复选框菜单项只要提供了checked属性该项即变为复选框const checkboxMenuItem { label: Show tables, handler(event, target, menuItem) {}, checked: true, };分隔线type: divider会在菜单项之间渲染一条水平线const dividerMenuItem { type: divider, };更多细节可参考 Context Menu 文档。通过 CSS 变量定制外观Table 组件使用一组以--bks-table-为前缀的 CSS 变量控制颜色体系覆盖表头、单元格、选中态、排序图标、范围选中边框与 tooltip 等视觉元素。默认值定义在 table.scss 中覆盖方式有两种直接作用于.BksTable类或通过外层自定义主题类做作用域限定。.BksTable { --bks-table-bg-color: #ffffff; --bks-table-fg-color: rgba(0, 0, 0, 0.87); --bks-table-header-bg-color: #ffffff; --bks-table-header-bg-color-selected: #f6df72; --bks-table-header-bg-color-highlight: #d9d9d9; --bks-table-header-fg-color: unset; --bks-table-header-fg-color-selected: #000000; --bks-table-header-fg-color-highlight: unset; --bks-table-header-border-color: #d9d9d9; --bks-table-header-col-bg-color: #ffffff; --bks-table-header-col-border-color: transparent; --bks-table-row-odd-bg-color: rgba(0, 0, 0, 0.02); --bks-table-cell-fg-color: unset; --bks-table-cell-bg-color-hover: rgba(0, 0, 0, 0.05); --bks-table-cell-bg-color-selected: rgba(0, 0, 0, 0.05); --bks-table-sorter-fg-color-active: #000000; --bks-table-sorter-fg-color-inactive: rgba(0, 0, 0, 0.35); --bks-table-range-border-color: #caa900; --bks-table-tooltip-bg-color: #292a2d; --bks-table-tooltip-fg-color: lightgray; }各变量的作用表头系列-header-bg/fg/border-*控制表头背景、前景、选中态与高亮态配色以及表头分隔线颜色-header-col-*表头列角区域列头与行头交汇处的背景与边框-row-odd-bg-color奇数行背景用于斑马纹效果单元格系列-cell-fg-color、-cell-bg-color-hover、-cell-bg-color-selected前景色、悬停与选中背景排序器系列-sorter-fg-color-active/inactive排序图标激活与未激活颜色-range-border-color电子表格式区域range选中边框颜色tooltip 系列-tooltip-bg/fg-color表头 tooltip 的背景与前景色。在 examples/html/custom-theme.css 中可以看到一个完整的换肤示例——用.custom-theme .BksTable { ... }把所有变量替换为高对比度的自定义色板。关于更一般的组件样式定制流程引入默认样式、追加自定义 CSS、按组件类定位可参考 Customizing UI Kit Components。方法与事件方法bks-table目前对外暴露一个方法见 Table API名称说明getTabulator()返回底层 Tabulator 实例可用于调用 Tabulator 的更新、数据操作等 API实现位于 Table.vue返回值类型为TabulatorFull | null。事件组件派发的事件都遵循bks-前缀 event.detail携带数据的约定见 types.ts事件名触发时机Event Detailbks-initialized表格初始化完成{ tabulator: Tabulator }bks-sorters-change排序器发生变化{ sorters: { field: string, dir: asc \| desc }[] }bks-ranges-change选中区域range发生变化{ ranges: TabulatorRange[] }bks-foreign-key-go-to点击外键跳转按钮{ value: any; field: string; cell: Tabulator.CellComponent }事件监听示例table.addEventListener(bks-sorters-change, (event) { console.log(event.detail.sorters); });从 Table.vue 的实现看bks-sorters-change由 Tabulator 的sortChanged事件转发而来bks-ranges-change通过监听cellMouseUp、headerMouseUp、keyNavigate、dataProcessed等事件比较选中区域四条边top/bottom/left/right是否变化后发出。此外组件内置了Ctrl/Cmd C复制选中区域的能力见 Table.vue与默认右键菜单的复制动作相互配合。底层实现Tabulator 集成要点理解bks-table的底层机制有助于排查问题和充分利用其能力Tabulator 内核组件渲染在一个普通的div classBksTable容器中Table.vue通过 tabulator.ts 中的tabulatorForTableData()创建TabulatorFull实例并注册了三个自定义模块HeaderSortTabulatorModule、EventBridgeTabulatorModule、ForeignCacheTabulatorModule见 tabulator.ts。默认选项表格默认开启列宽/显隐持久化persistenceMode: local、水平虚拟滚动、多区域选择selectableRange相关选项、列可拖动、双击编辑行头以冻结列形式实现显示行号并支持rowHeaderOffset偏移tabulator.ts。tabulatorOptions属性可以覆盖这些默认值。生命周期组件挂载时初始化表格data/columns变化触发增量更新preventRedraw可临时阻止重绘redrawState/reinitializeState分别触发整表重绘与销毁重建Table.vue。小结bks-table以自定义元素 属性/事件 CSS 变量 Tabulator 透传四层设计把数据库表格展示所需的能力完整沉淀为一个可复用组件data/columns驱动渲染primaryKey/foreignKey/generated呈现键语义editable开启双击编辑五类*ContextMenuItems属性配合MenuItem结构实现右键菜单深度定制CSS 变量体系支持无缝换肤。对于需要展示查询结果、表数据浏览或嵌入表格编辑功能的数据库工具类应用直接从 Getting Started 安装后参照本文的属性表、事件表与菜单定制示例即可快速落地。【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表