This commit is contained in:
oneao committed 2026-10-14 22:24:12 +08:00
1 parent e434374db5
commit b4498e5350
31 files changed
+2007 -294

No files matched your search

@@ -220,7 +220,7 @@ watch(n, (v) => { rows.value = Array.from({ length: v }, (_, i) => makeRow(i)) }
| `virtualX` | `boolean` | `true` | 横向虚拟滚动总开关(实际是否开启受列数门控) |
| `rowHeight` | `number` | `30` | 行高,同时驱动虚拟滚动计算 |
| `headerRowHeight` | `number` | `34` | 表头行高 |
| `bordered` | `boolean` | `true` | 是否显示边框(透传给底座的 `bordered: true`)。边框由底座绘制,不再是自绘外框 + 圆角 |
| `bordered` | `boolean` | `true` | 边框。`true` = 自绘圆角外框 + 行分隔线;`false` = 无外框,只留行分隔线(嵌进卡片 / 面板时用) |
| `stripe` | `boolean` | `false` | 斑马纹(隔行底色)。**固定列会一起上条纹**(见「固定列」):库只把条纹画在 `tr` 上,冻结列的底色必须不透明,组件在它上面补一层同色内阴影接上 |
| `fixedColShadow` | `boolean` | `false` | 固定列被滚动内容遮挡时画 10px 渐变阴影(见「固定列」) |
| `colResizable` | `boolean \| object` | `true` | 列宽拖拽;未绑定 `v-model:columns` 时自动关闭。可用 `{ disabled: (col) => boolean }` 按列禁用 |
@@ -356,10 +356,13 @@ watch(n, (v) => { rows.value = Array.from({ length: v }, (_, i) => makeRow(i)) }
- **主题通过覆盖库的 CSS 变量实现**:库把 41 个主题值都做成了 `.stk-table` 作用域内的变量,组件把它们映射到 `--g3-*` 令牌(覆盖层在 `src/table/style/_overrides.scss`)。改变量而不是逐个选择器改样式,库升级时不容易失效。
- **区域选择按需自注册**:库的单元格区域选择是全局注册的(`registerFeature(useAreaSelection)`),不注册则 `area-selection-change` 永不触发、行内编辑失效。组件库不拥有 app 启动流程,因此**首次挂载时自动注册一次**;需要显式控制时可调用导出的 `registerTableFeatures()`。
- **`data-testid` 透传到内层**:组件 `inheritAttrs: false`,`$attrs` 落在内层 `StkTable` 上,所以写 E2E 时按类名 `.g3-table` 定位根节点。
- **边框完全交给底座**:组件把 `bordered` 直接透传为底座的 `bordered: true`,**不再自绘外框与行分隔线**。因此:
- 底座用逐格 `background-image` 渐变画线(不是 `border`),横竖线都来自 `--bg-border-*` 变量;
- 受滚动条影响,**表格右侧与底部的边框会消失**——这是底座文档(`table/basic/bordered`)明确说明的行为,需要时自行补 CSS;
- 没有圆角;`bordered: false` 时四边与格线全部消失。
- **边框:外框自绘,格线仍用底座的渐变**。组件把 `bordered` 翻成底座的 `'v'` 档(只借它的竖线),再自己补外框:
- **外框** → 外层容器上的真 `border` + 圆角令牌(`bordered: false` 时不描边);
- **横线** → 把 `'v'` 档清零的 `--bg-border-bottom` 配方拿回来;
- **竖线** → 底座原样,只抹掉最右列那条(外侧线归外框管)。
为什么不全交给底座:它的外框是 `border-left` + 三段背景渐变拼的,**做不出圆角**,且其右侧 / 底部边框会因滚动条占位而消失(底座 `table/basic/bordered` 文档明确说明)。
⚠️ 格线**不能**改写成真 `border`:行内编辑器被钉死在 `var(--row-height)`,单元格多出 1px 边线就会被顶高 1px,而行高是虚拟滚动 `translateY` 的计算基准。背景渐变不参与盒模型。
颜色只有 `--g3-border-color` 一个入口,亮 / 暗主题自动跟随。
- **`--th-bgc` 等表头/表尾底色**由覆盖层的变量映射提供,不通过行内 style 注入。
- **行编辑态存在 `WeakMap` 里**:按行对象存,不给业务数据打标记;行被回收时状态自动释放。行与行之间切换编辑**不翻转** `editingActive`,避免整表列重建。
- **编辑器无缝嵌入单元格**(`editorSeamless`):把 `G3Input` / `G3Select` 自带的 `padding` / `border` / `border-radius` / `background` 置零,只保留焦点、hover 与校验提示;编辑器的高度由组件显式钉成 `var(--row-height)`(不能被控件的 `min-height: 32px` 顶高,也不能靠 `height: 100%` —— td 的内容盒不等于行高),因此**编辑前后的行高完全一致**。焦点环画在外层 `td` 的 `inset` 阴影上:不参与盒模型计算,几何零影响。
@@ -5,7 +5,7 @@ import type { G3TableColumn, TableRow } from '@g3soft/ui'
// 最小用法:给 columns 与 dataSource 两份数据即可。
// - seq 默认开启,会在最前列注入序号列
// - bordered 默认开启,边框由底座(stk-table-vue)绘制
// - bordered 默认开启:圆角外框由组件自绘;横竖格线仍走底座的背景渐变
// - 没写 width 的列会自动摊掉剩余宽度
// - 本例额外开了 `stripe`(斑马纹,默认关):注意**序号列也带条纹** ——
// 冻结列的底色必须不透明(否则横滚时被压住的内容会透字),