@taocompany/magic-grid 0.4.8 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +377 -79
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts +10 -3
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/useGridApi.d.ts +6 -0
- package/dist/components/MagicGrid/useGridApi.d.ts.map +1 -0
- package/dist/components/MagicGrid/useGridLifecycle.d.ts +11 -0
- package/dist/components/MagicGrid/useGridLifecycle.d.ts.map +1 -0
- package/dist/core/api/gridApi.d.ts.map +1 -1
- package/dist/core/cell/cellCtrl.d.ts.map +1 -1
- package/dist/core/column/columnModel.d.ts.map +1 -1
- package/dist/core/editing/builtInEditors.d.ts +15 -7
- package/dist/core/editing/builtInEditors.d.ts.map +1 -1
- package/dist/core/editing/cellEditPipeline.d.ts +3 -3
- package/dist/core/editing/cellEditPipeline.d.ts.map +1 -1
- package/dist/core/editing/cellEditingService.d.ts.map +1 -1
- package/dist/core/editing/cellEditorHost.d.ts.map +1 -1
- package/dist/core/editing/checkboxEditorValue.d.ts +14 -0
- package/dist/core/editing/checkboxEditorValue.d.ts.map +1 -0
- package/dist/core/editing/index.d.ts +4 -2
- package/dist/core/editing/index.d.ts.map +1 -1
- package/dist/core/editing/inlineCellEditorHost.d.ts +1 -1
- package/dist/core/editing/inlineCellEditorHost.d.ts.map +1 -1
- package/dist/core/editing/inlineCellEditorService.d.ts +2 -0
- package/dist/core/editing/inlineCellEditorService.d.ts.map +1 -1
- package/dist/core/editing/readCellEditorValue.d.ts +3 -1
- package/dist/core/editing/readCellEditorValue.d.ts.map +1 -1
- package/dist/core/editing/switchEditorValue.d.ts +6 -0
- package/dist/core/editing/switchEditorValue.d.ts.map +1 -0
- package/dist/core/editing/toggleEditorValue.d.ts +23 -0
- package/dist/core/editing/toggleEditorValue.d.ts.map +1 -0
- package/dist/core/grid/cellEditing/editorParams.d.ts.map +1 -1
- package/dist/core/grid/cellEditing/startEditing.d.ts.map +1 -1
- package/dist/core/grid/cellEditing/types.d.ts +2 -0
- package/dist/core/grid/cellEditing/types.d.ts.map +1 -1
- package/dist/core/grid/cellRangeDeleteWrite.d.ts +2 -0
- package/dist/core/grid/cellRangeDeleteWrite.d.ts.map +1 -1
- package/dist/core/grid/cellRangeFillWrite.d.ts +2 -0
- package/dist/core/grid/cellRangeFillWrite.d.ts.map +1 -1
- package/dist/core/grid/grid.d.ts +4 -1
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/cellRangeDragSession.d.ts +1 -1
- package/dist/core/grid/gridInteraction/cellRangeDragSession.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/focusController.d.ts +2 -2
- package/dist/core/grid/gridInteraction/focusController.d.ts.map +1 -1
- package/dist/core/selection/cellClipboardService.d.ts +2 -0
- package/dist/core/selection/cellClipboardService.d.ts.map +1 -1
- package/dist/core/types/cellEditor.d.ts +11 -2
- package/dist/core/types/cellEditor.d.ts.map +1 -1
- package/dist/core/types/checkboxEditor.d.ts +8 -0
- package/dist/core/types/checkboxEditor.d.ts.map +1 -0
- package/dist/core/types/column.d.ts +6 -0
- package/dist/core/types/column.d.ts.map +1 -1
- package/dist/core/types/events.d.ts +6 -1
- package/dist/core/types/events.d.ts.map +1 -1
- package/dist/core/types/gridLifecycle.d.ts +24 -0
- package/dist/core/types/gridLifecycle.d.ts.map +1 -0
- package/dist/core/types/gridOptions.d.ts +3 -0
- package/dist/core/types/gridOptions.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/switchEditor.d.ts +8 -0
- package/dist/core/types/switchEditor.d.ts.map +1 -0
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +3947 -3790
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/core.d.ts +65 -6
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/magic-grid-expose.d.ts +2 -3
- package/dist/types/magic-grid-expose.d.ts.map +1 -1
- package/dist/types/magic-grid.d.ts +9 -1
- package/dist/types/magic-grid.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
- [Expose](#expose)
|
|
22
22
|
- [Slots](#slots)
|
|
23
23
|
- [单元格编辑](#单元格编辑)
|
|
24
|
+
- [呈现模式:overlay 与 inline](#呈现模式overlay-与-inline)
|
|
25
|
+
- [内置编辑器](#内置编辑器)
|
|
24
26
|
- [数据校验](#数据校验)
|
|
25
27
|
- [键盘导航与快捷键](#键盘导航与快捷键)
|
|
26
28
|
- [辅助组件](#辅助组件)
|
|
@@ -31,7 +33,6 @@
|
|
|
31
33
|
- [包入口与导出](#包入口与导出)
|
|
32
34
|
- [TypeScript 集成](#typescript-集成)
|
|
33
35
|
- [类型与校验子路径](#类型与校验子路径)
|
|
34
|
-
- [本地开发与 Playground](#本地开发与-playground)
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
@@ -43,11 +44,11 @@
|
|
|
43
44
|
|------|------|
|
|
44
45
|
| **性能** | 行/列双轴虚拟化、DOM 池复用、RAF 帧预算分片、Cell Renderer 滚动调度(idle flush · 按行合并 · placeholder-then-vue)、增量数据管线 |
|
|
45
46
|
| **数据** | 排序、列筛选、Quick Filter、事务增量更新(`applyTransaction`)、行 CRUD |
|
|
46
|
-
| **交互** |
|
|
47
|
+
| **交互** | 单元格/行编辑(内置 text/number/checkbox/switch · overlay/inline)、校验、行选择、索引列定位、框选与剪贴板 |
|
|
47
48
|
| **布局** | 固定列、列拖拽/调整宽度、列有效性与显隐(`available` / `hidden`)、合并单元格、动态行高、主从展开行 |
|
|
48
49
|
| **结构** | 行分组、树形表格(含懒加载)、表尾汇总 |
|
|
49
50
|
| **体验** | 溢出 Tooltip、单元格批注、空态 Overlay、暗色主题、底部状态栏 |
|
|
50
|
-
| **扩展** |
|
|
51
|
+
| **扩展** | 列设置面板、内置编辑器(text/number/checkbox/switch)、Vue 第三方编辑器 Composable、inline 常驻编辑器、async-validator 校验 |
|
|
51
52
|
|
|
52
53
|
当前版本:**0.3.0**(`@taocompany/magic-grid`)。
|
|
53
54
|
|
|
@@ -192,7 +193,7 @@ const columns: ColumnDef[] = [
|
|
|
192
193
|
- 避免在 `cellRenderer` / `formatter` / `valueGetter` 中创建重量级对象或触发外部副作用;这些函数在滚动时会高频调用。
|
|
193
194
|
- 多列使用 `#cell-{colId}` Vue 插槽时,滚停后可能出现 renderer 列空白拖尾;见下方 [Cell Renderer 滚动渲染](#cell-renderer-滚动渲染) 与 [docs/41-cell-renderer-scroll-performance.md](docs/41-cell-renderer-scroll-performance.md)。
|
|
194
195
|
- 合并单元格(`enableCellSpan`)会启用 `style.top` 行定位并增加 span cache 开销,仅在确有需求时开启。
|
|
195
|
-
-
|
|
196
|
+
- 生产环境可通过 `scroll` / `data-rendered` 事件订阅渲染完成时机;开发调试时可关注 DOM 行池规模与 `setData` 耗时。
|
|
196
197
|
|
|
197
198
|
### Cell Renderer 滚动渲染
|
|
198
199
|
|
|
@@ -225,7 +226,7 @@ const columns: ColumnDef[] = [
|
|
|
225
226
|
/>
|
|
226
227
|
```
|
|
227
228
|
|
|
228
|
-
`placeholder-then-vue` 模式下,slot 列需配置可读 `prop` 或 `formatter
|
|
229
|
+
`placeholder-then-vue` 模式下,slot 列需配置可读 `prop` 或 `formatter`,滚动态才有文字兜底。完整方案见 [docs/41-cell-renderer-scroll-performance.md](docs/41-cell-renderer-scroll-performance.md)。
|
|
229
230
|
|
|
230
231
|
---
|
|
231
232
|
|
|
@@ -649,6 +650,8 @@ interface RowSelectionConfig {
|
|
|
649
650
|
| `groupFooterLabel` | `string` | — | groupFooter 首列展示标签 |
|
|
650
651
|
| `groupCellRenderer` | `GroupCellRendererFn` | — | 自定义分组单元格渲染器 |
|
|
651
652
|
|
|
653
|
+
> **编辑**:启用单元格编辑时,仅 **leaf 数据行**可进入编辑态;`groupHeader` / `groupFooter` **不渲染** inline 或 overlay 编辑器(由 `isCellEditable` + `cellCtrl` 共同保证)。
|
|
654
|
+
|
|
652
655
|
#### 树形表格
|
|
653
656
|
|
|
654
657
|
| Prop | 类型 | 默认值 | 说明 |
|
|
@@ -837,8 +840,6 @@ api.getColumns().some((c) => c.colId === 'internalCode') // false
|
|
|
837
840
|
|
|
838
841
|
修改 `columns` 中某列的 `available` 或 `hidden` 后,Grid 会走 `setColumns` 重解析。`hidden` 在 `columnDefs` 未改 `hidden` 声明时,会保留运行时 API/菜单设置的值(与 Phase 22 列显隐语义一致)。
|
|
839
842
|
|
|
840
|
-
Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列可切换 `available`)。
|
|
841
|
-
|
|
842
843
|
#### 尺寸
|
|
843
844
|
|
|
844
845
|
| 字段 | 类型 | 说明 |
|
|
@@ -895,7 +896,9 @@ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列
|
|
|
895
896
|
| `formatter` | `(row, value) => string` | 展示格式化 |
|
|
896
897
|
| `cellRenderer` | `CellRendererFn` | 自定义单元格渲染器(函数;Vue 组件通过 `#cell-{colId}` 插槽) |
|
|
897
898
|
| `cellRendererMount` | `'vue' \| 'sync'` | 列级 renderer 挂载类型;配合 `cellRendererDefer: 'sync-only'` 使用 |
|
|
898
|
-
| `cellEditor` | `CellEditorDef` | 自定义单元格编辑器(函数、内置 `text`/`number`/`checkbox`、或命名引用) |
|
|
899
|
+
| `cellEditor` | `CellEditorDef` | 自定义单元格编辑器(函数、内置 `text`/`number`/`checkbox`/`switch`、或命名引用) |
|
|
900
|
+
| `checkboxEditorParams` | `CheckboxEditorParams` | 内置 checkbox:自定义选中/未选中写回值(默认 `true`/`false`) |
|
|
901
|
+
| `switchEditorParams` | `SwitchEditorParams` | 内置 switch:自定义开启/未开启写回值(默认 `true`/`false`) |
|
|
899
902
|
| `cellEditorMode` | `'overlay' \| 'inline'` | 编辑器呈现方式;默认 `overlay` |
|
|
900
903
|
| `valueParser` | `(value, params) => unknown` | 提交前解析编辑值 |
|
|
901
904
|
| `valueSetter` | `(params) => boolean \| Promise<boolean>` | 自定义写回逻辑;返回 `false` 拒绝提交 |
|
|
@@ -1342,7 +1345,52 @@ api.clearAllFilters()
|
|
|
1342
1345
|
|
|
1343
1346
|
## Events
|
|
1344
1347
|
|
|
1345
|
-
MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 **kebab-case**。除 Vue 事件外,也可通过 `gridRef.api.on(...)` 订阅 camelCase 内核事件(见 [Expose](#expose))。
|
|
1348
|
+
MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 **kebab-case**。除 Vue 事件外,也可通过 `gridRef.value?.api.on(...)` 订阅 camelCase 内核事件(见 [Expose](#expose))。
|
|
1349
|
+
|
|
1350
|
+
### 生命周期
|
|
1351
|
+
|
|
1352
|
+
| Vue 事件 | 内核事件 | 频率 | 说明 |
|
|
1353
|
+
|----------|----------|------|------|
|
|
1354
|
+
| `@grid-ready` | `gridReady` | 每次 Grid 实例创建 | `initGrid` 完成、`setData` 已调用;`event.api` 可立即使用 |
|
|
1355
|
+
| `@grid-destroyed` | `gridDestroyed` | 每次 Grid 实例销毁 | reinit 或组件卸载前;`event.reason` 为 `'reinit'` \| `'unmount'` |
|
|
1356
|
+
| `@first-rendered` | `firstRendered` | 每个实例一次 | 该实例首次 RAF 渲染完成;payload 含 `api` 与 `metrics` |
|
|
1357
|
+
|
|
1358
|
+
`@data-rendered` 仍表示**每一轮**数据渲染完成(见下节),与 `@first-rendered` 语义分离。
|
|
1359
|
+
|
|
1360
|
+
```vue
|
|
1361
|
+
<script setup lang="ts">
|
|
1362
|
+
import { useGridLifecycle } from '@taocompany/magic-grid'
|
|
1363
|
+
|
|
1364
|
+
const lifecycle = useGridLifecycle({
|
|
1365
|
+
onReady: ({ api }) => {
|
|
1366
|
+
api.setSortModel([{ colId: 'name', sort: 'asc' }])
|
|
1367
|
+
},
|
|
1368
|
+
onDestroyed: ({ reason }) => {
|
|
1369
|
+
if (reason === 'reinit') {
|
|
1370
|
+
// 清理旧 api 订阅
|
|
1371
|
+
}
|
|
1372
|
+
},
|
|
1373
|
+
onFirstRendered: ({ api }) => {
|
|
1374
|
+
api.ensureIndexVisible(0, 'top')
|
|
1375
|
+
},
|
|
1376
|
+
})
|
|
1377
|
+
</script>
|
|
1378
|
+
|
|
1379
|
+
<template>
|
|
1380
|
+
<MagicGrid :columns="columns" :data="rows" v-on="lifecycle" />
|
|
1381
|
+
</template>
|
|
1382
|
+
```
|
|
1383
|
+
|
|
1384
|
+
也可直接在模板绑定 `@grid-ready` / `@grid-destroyed` / `@first-rendered`。
|
|
1385
|
+
|
|
1386
|
+
内核订阅(payload 与 Vue 事件相同):
|
|
1387
|
+
|
|
1388
|
+
```ts
|
|
1389
|
+
function onGridReady({ api }: GridReadyEvent) {
|
|
1390
|
+
const off = api.on('selectionChanged', handler)
|
|
1391
|
+
// 在 @grid-destroyed 或 api.on('gridDestroyed') 里 off()
|
|
1392
|
+
}
|
|
1393
|
+
```
|
|
1346
1394
|
|
|
1347
1395
|
### 渲染与滚动
|
|
1348
1396
|
|
|
@@ -1735,7 +1783,7 @@ payload 为 `RowExpansionChangedEvent`:
|
|
|
1735
1783
|
|
|
1736
1784
|
| 成员 | 类型 | 说明 |
|
|
1737
1785
|
|------|------|------|
|
|
1738
|
-
| `api` | `
|
|
1786
|
+
| `api` | `GridApi \| undefined` | GridApi 实例;挂载完成后可用 |
|
|
1739
1787
|
| `getMetrics()` | `() => GridMetrics \| undefined` | 读取渲染与滚动指标(同 `scroll` / `data-rendered` 事件 payload) |
|
|
1740
1788
|
| `scrollTo(scrollTop, scrollLeft?)` | `(number, number?) => void` | 编程式滚动;scrollLeft 省略时保持当前值 |
|
|
1741
1789
|
| `setSortModel(model)` | `(SortModelItem[]) => void` | 设置排序模型并重算 display 行 |
|
|
@@ -1754,7 +1802,7 @@ payload 为 `RowExpansionChangedEvent`:
|
|
|
1754
1802
|
|
|
1755
1803
|
```ts
|
|
1756
1804
|
interface MagicGridExpose {
|
|
1757
|
-
api:
|
|
1805
|
+
api: GridApi | undefined
|
|
1758
1806
|
getMetrics: () => GridMetrics | undefined
|
|
1759
1807
|
scrollTo: (scrollTop: number, scrollLeft?: number) => void
|
|
1760
1808
|
setSortModel: (model: SortModelItem[]) => void
|
|
@@ -1776,31 +1824,31 @@ interface MagicGridExpose {
|
|
|
1776
1824
|
```vue
|
|
1777
1825
|
<script setup lang="ts">
|
|
1778
1826
|
import { ref } from 'vue'
|
|
1779
|
-
import type { MagicGridExpose } from '@taocompany/magic-grid/types/core'
|
|
1827
|
+
import type { GridReadyEvent, MagicGridExpose } from '@taocompany/magic-grid/types/core'
|
|
1780
1828
|
|
|
1781
1829
|
const gridRef = ref<MagicGridExpose>()
|
|
1782
1830
|
|
|
1831
|
+
function onGridReady({ api }: GridReadyEvent) {
|
|
1832
|
+
api.setSortModel([{ colId: 'name', sort: 'asc' }])
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1783
1835
|
async function addRow() {
|
|
1784
1836
|
await gridRef.value?.applyTransaction({
|
|
1785
1837
|
add: [{ id: Date.now(), name: '新行' }],
|
|
1786
1838
|
})
|
|
1787
1839
|
}
|
|
1788
|
-
|
|
1789
|
-
function exportData() {
|
|
1790
|
-
return gridRef.value?.getData({ sourceOrder: true })
|
|
1791
|
-
}
|
|
1792
|
-
|
|
1793
|
-
function scrollToRow(index: number) {
|
|
1794
|
-
gridRef.value?.ensureIndexVisible(index, 'middle')
|
|
1795
|
-
}
|
|
1796
1840
|
</script>
|
|
1797
1841
|
|
|
1798
1842
|
<template>
|
|
1799
|
-
<MagicGrid ref="gridRef" ... />
|
|
1843
|
+
<MagicGrid ref="gridRef" @grid-ready="onGridReady" ... />
|
|
1800
1844
|
</template>
|
|
1801
1845
|
```
|
|
1802
1846
|
|
|
1803
|
-
|
|
1847
|
+
获取 api 的推荐方式见 [Events · 生命周期](#生命周期)。ref 亦可直接调用:`gridRef.value?.api?.getData()`。
|
|
1848
|
+
|
|
1849
|
+
在 `computed` / 模板中追踪 api 时,可用 `useGridApi(gridRef)`(等价于 `computed(() => gridRef.value?.api)`)。
|
|
1850
|
+
|
|
1851
|
+
### GridApi(`gridRef.value?.api`)
|
|
1804
1852
|
|
|
1805
1853
|
`api` 是完整的命令式 API 面。以下按职责分组列出全部公开方法;入参 rowId 均接受 `string | number`,出参 rowId 恒为 `string`。
|
|
1806
1854
|
|
|
@@ -1945,6 +1993,9 @@ GridApi 支持 `on(eventType, handler)` 订阅内核事件(camelCase),返
|
|
|
1945
1993
|
|
|
1946
1994
|
| 内核事件名 | 对应 Vue 事件 |
|
|
1947
1995
|
|------------|---------------|
|
|
1996
|
+
| `gridReady` | `grid-ready` |
|
|
1997
|
+
| `gridDestroyed` | `grid-destroyed` |
|
|
1998
|
+
| `firstRendered` | `first-rendered` |
|
|
1948
1999
|
| `selectionChanged` | `selection-changed` |
|
|
1949
2000
|
| `cellValueChanged` | `cell-value-changed` |
|
|
1950
2001
|
| `sortChanged` | `sort-changed` |
|
|
@@ -2167,17 +2218,18 @@ Magic Grid 支持 **overlay**(点击/Enter 进入编辑浮层)与 **inline**
|
|
|
2167
2218
|
| 模式 | 配置 | 行为 |
|
|
2168
2219
|
|------|------|------|
|
|
2169
2220
|
| **overlay**(默认) | `cellEditorMode: 'overlay'` 或省略 | 非编辑态展示 formatter / cellRenderer;进入编辑态后在单元格上方挂载编辑器 |
|
|
2170
|
-
| **inline** | `cellEditorMode: 'inline'` + 必须配置 `cellEditor` |
|
|
2221
|
+
| **inline** | `cellEditorMode: 'inline'` + 必须配置 `cellEditor` | 编辑器始终渲染在格内;单击单元格或 Space 切换 checkbox/switch;适合布尔列、简单输入 |
|
|
2171
2222
|
|
|
2172
2223
|
**inline 限制**(开发模式会 console.warn):
|
|
2173
2224
|
|
|
2174
2225
|
- 系统列(索引 / 行选择)不支持 inline。
|
|
2175
|
-
- 推荐搭配内置 `'text'` / `'number'` / `'checkbox'`;依赖 teleport/下拉的第三方组件(如 Select)应使用 overlay + `useCellEditor({ strategy: 'overlay' })`。
|
|
2176
|
-
- inline 列通过 `params.commit()` / 空格(checkbox)提交;不走 overlay 的 Enter 捕获逻辑。
|
|
2226
|
+
- 推荐搭配内置 `'text'` / `'number'` / `'checkbox'` / `'switch'`;依赖 teleport/下拉的第三方组件(如 Select)应使用 overlay + `useCellEditor({ strategy: 'overlay' })`。
|
|
2227
|
+
- inline 列通过 `params.commit()` / 单击单元格 / 空格(checkbox/switch)提交;不走 overlay 的 Enter 捕获逻辑。
|
|
2177
2228
|
|
|
2178
2229
|
```ts
|
|
2179
2230
|
const columns: ColumnDef[] = [
|
|
2180
2231
|
{ prop: 'done', label: '完成', width: 80, cellEditorMode: 'inline', cellEditor: 'checkbox' },
|
|
2232
|
+
{ prop: 'enabled', label: '启用', width: 88, cellEditorMode: 'inline', cellEditor: 'switch' },
|
|
2181
2233
|
{ prop: 'qty', label: '数量', cellEditorMode: 'inline', cellEditor: 'number', editable: true },
|
|
2182
2234
|
]
|
|
2183
2235
|
```
|
|
@@ -2186,13 +2238,298 @@ Grid 级 `editBehavior: 'row'` 时整行同时进入编辑;Tab 在同行可编
|
|
|
2186
2238
|
|
|
2187
2239
|
### 内置编辑器
|
|
2188
2240
|
|
|
2189
|
-
|
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2241
|
+
Magic Grid 提供四种 **零注册** 内置编辑器,列定义中直接引用字符串即可:`cellEditor: 'text' | 'number' | 'checkbox' | 'switch'`。未配置 `cellEditor` 时,overlay 编辑 **默认回退为 `'text'`**。
|
|
2242
|
+
|
|
2243
|
+
内置名 **不可** 用于 `registerCellEditor` 覆盖;命名注册表仅用于自定义编辑器。
|
|
2244
|
+
|
|
2245
|
+
#### 总览
|
|
2246
|
+
|
|
2247
|
+
| 名称 | 控件 | 典型场景 | 推荐 `cellEditorMode` | 默认写回类型 |
|
|
2248
|
+
|------|------|----------|----------------------|--------------|
|
|
2249
|
+
| `'text'` | `<input type="text">` | 单行文本 | `overlay` | `string` |
|
|
2250
|
+
| `'number'` | `<input type="number">` | 数值 | `overlay` 或 `inline` | `number`(空串拒绝提交) |
|
|
2251
|
+
| `'checkbox'` | `<input type="checkbox">` | 布尔 / 二元状态 | **`inline`**(也可 `overlay`) | `boolean`(可自定义) |
|
|
2252
|
+
| `'switch'` | `<input type="checkbox" role="switch">` | 开关态 | **`inline`**(也可 `overlay`) | `boolean`(可自定义) |
|
|
2253
|
+
|
|
2254
|
+
#### 解析优先级
|
|
2255
|
+
|
|
2256
|
+
列进入编辑(overlay)或 inline 常驻挂载时,`cellEditor: 'someName'` 按以下顺序解析:
|
|
2257
|
+
|
|
2258
|
+
1. **内置名** `'text'` | `'number'` | `'checkbox'` | `'switch'`
|
|
2259
|
+
2. **列级函数** `(params, ctx) => HTMLElement`
|
|
2260
|
+
3. **Grid 实例级** `cellEditorRegistry` / `cellEditors.byName`
|
|
2261
|
+
4. **全局** `registerCellEditor(name)`
|
|
2262
|
+
5. 未找到 → `console.warn` + 回退 **`text`** 编辑器
|
|
2263
|
+
|
|
2264
|
+
#### `'text'` — 单行文本
|
|
2265
|
+
|
|
2266
|
+
| 项 | 说明 |
|
|
2267
|
+
|----|------|
|
|
2268
|
+
| DOM | `<input type="text" class="mg-cell-editor">` |
|
|
2269
|
+
| 初始值 | `params.formattedValue`(经 formatter 格式化后的字符串) |
|
|
2270
|
+
| 默认 `valueParser` | 原样返回 raw 字符串 |
|
|
2271
|
+
| overlay 提交 | Enter / blur / Tab(Tab 可链式下一 editable 格) |
|
|
2272
|
+
| inline | 支持;`change` 或 `params.commit()` 提交;不走 Enter 捕获 |
|
|
2273
|
+
|
|
2274
|
+
```ts
|
|
2275
|
+
{ prop: 'name', label: '姓名', editable: true, cellEditor: 'text' }
|
|
2276
|
+
// 省略 cellEditor 时 overlay 编辑同样使用 text 编辑器
|
|
2277
|
+
```
|
|
2278
|
+
|
|
2279
|
+
#### `'number'` — 数字输入
|
|
2280
|
+
|
|
2281
|
+
| 项 | 说明 |
|
|
2282
|
+
|----|------|
|
|
2283
|
+
| DOM | `<input type="number" class="mg-cell-editor">` |
|
|
2284
|
+
| 初始值 | 单元格值为 `null` / `''` 时显示空串,否则 `String(value)` |
|
|
2285
|
+
| 默认 `valueParser` | 去空白后 `Number()`;空串或非有限数 → **拒绝提交** |
|
|
2286
|
+
| 自定义解析 | 推荐显式配置 `valueParser`,例如 `(v) => (v === '' ? null : Number(v))` |
|
|
2287
|
+
|
|
2288
|
+
```ts
|
|
2289
|
+
{
|
|
2290
|
+
prop: 'qty',
|
|
2291
|
+
label: '数量',
|
|
2292
|
+
editable: true,
|
|
2293
|
+
cellEditor: 'number',
|
|
2294
|
+
valueParser: (raw) => {
|
|
2295
|
+
const n = Number(raw)
|
|
2296
|
+
if (!Number.isFinite(n)) throw new Error('请输入有效数字')
|
|
2297
|
+
return n
|
|
2298
|
+
},
|
|
2299
|
+
}
|
|
2300
|
+
```
|
|
2301
|
+
|
|
2302
|
+
#### `'checkbox'` — 复选框
|
|
2303
|
+
|
|
2304
|
+
checkbox 适用于二元字段。支持 **overlay**(进入编辑态后显示控件)与 **inline**(控件常驻格内,改值即提交)两种呈现;布尔列 **强烈推荐 inline**。
|
|
2305
|
+
|
|
2306
|
+
| 项 | 说明 |
|
|
2307
|
+
|----|------|
|
|
2308
|
+
| DOM | `<input type="checkbox" class="mg-cell-editor [mg-inline-checkbox]">` |
|
|
2309
|
+
| 初始 checked | `coerceCheckboxEditorValue(value, checkboxEditorParams)` |
|
|
2310
|
+
| 读值 | `readCheckboxControlValue` → JSON 序列化 raw(默认 `'true'` / `'false'`) |
|
|
2311
|
+
| 默认 `valueParser` | `parseCheckboxEditorRawValue` |
|
|
2312
|
+
| inline 提交 | 控件 `@change` 即 commit;**单击单元格空白** 同样 toggle + commit |
|
|
2313
|
+
| overlay 提交 | 进入编辑态后 change / Enter / blur 走常规 overlay 管线 |
|
|
2314
|
+
| 键盘 | 焦点在 inline checkbox 格时 **Space** toggle + commit(不触发行选择) |
|
|
2315
|
+
| disabled | `editable: false` 或 `editable(row) => false` → `.mg-cell--inline-disabled` |
|
|
2316
|
+
|
|
2317
|
+
**自定义写回值**(`checkboxEditorParams`):
|
|
2318
|
+
|
|
2319
|
+
```ts
|
|
2320
|
+
interface CheckboxEditorParams {
|
|
2321
|
+
/** 选中态写回值;默认 `true` */
|
|
2322
|
+
checkedValue?: unknown
|
|
2323
|
+
/** 未选中态写回值;默认 `false` */
|
|
2324
|
+
uncheckedValue?: unknown
|
|
2325
|
+
}
|
|
2326
|
+
```
|
|
2327
|
+
|
|
2328
|
+
| 示例配置 | 写回值 |
|
|
2329
|
+
|----------|--------|
|
|
2330
|
+
| 默认(省略 params) | `true` / `false` |
|
|
2331
|
+
| `{ checkedValue: 1, uncheckedValue: 0 }` | `1` / `0` |
|
|
2332
|
+
| `{ checkedValue: 'Y', uncheckedValue: 'N' }` | `'Y'` / `'N'` |
|
|
2333
|
+
|
|
2334
|
+
**值 → checked 态映射规则**:
|
|
2335
|
+
|
|
2336
|
+
- 单元格值 **严格等于** `checkedValue` → checked
|
|
2337
|
+
- 单元格值 **严格等于** `uncheckedValue` → unchecked
|
|
2338
|
+
- **未配置自定义值** 时,额外兼容常见 falsy/truthy:`null` / `''` / `false` / `'false'` / `0` / `'0'` → unchecked;`true` / `'true'` / `1` / `'1'` → checked;其余走 `Boolean(value)`
|
|
2339
|
+
- **已配置自定义值** 时,仅精确匹配 on/off 值;不匹配则默认为 unchecked
|
|
2340
|
+
|
|
2341
|
+
```ts
|
|
2342
|
+
const columns: ColumnDef[] = [
|
|
2343
|
+
// inline · 默认 boolean
|
|
2344
|
+
{ prop: 'active', label: '启用', width: 72, cellEditorMode: 'inline', cellEditor: 'checkbox' },
|
|
2345
|
+
// inline · 写回 1/0
|
|
2346
|
+
{
|
|
2347
|
+
prop: 'activeFlag',
|
|
2348
|
+
label: '激活',
|
|
2349
|
+
width: 72,
|
|
2350
|
+
cellEditorMode: 'inline',
|
|
2351
|
+
cellEditor: 'checkbox',
|
|
2352
|
+
checkboxEditorParams: { checkedValue: 1, uncheckedValue: 0 },
|
|
2353
|
+
},
|
|
2354
|
+
// overlay · 写回 Y/N
|
|
2355
|
+
{
|
|
2356
|
+
prop: 'confirmed',
|
|
2357
|
+
label: '已确认',
|
|
2358
|
+
width: 88,
|
|
2359
|
+
editable: true,
|
|
2360
|
+
cellEditor: 'checkbox',
|
|
2361
|
+
checkboxEditorParams: { checkedValue: 'Y', uncheckedValue: 'N' },
|
|
2362
|
+
},
|
|
2363
|
+
]
|
|
2364
|
+
```
|
|
2365
|
+
|
|
2366
|
+
#### `'switch'` — 开关
|
|
2367
|
+
|
|
2368
|
+
switch 在语义与管线上与 checkbox **共用 toggle 值引擎**,UI 为 pill 形开关(`role="switch"`)。交互、inline/overlay 行为、键盘与 disabled 规则与 checkbox 一致。
|
|
2369
|
+
|
|
2370
|
+
| 项 | 说明 |
|
|
2371
|
+
|----|------|
|
|
2372
|
+
| DOM | `<input type="checkbox" role="switch" class="mg-cell-editor mg-switch-editor [mg-inline-switch]">` |
|
|
2373
|
+
| 初始 checked | `coerceSwitchEditorValue(value, switchEditorParams)` |
|
|
2374
|
+
| 读值 | `readSwitchControlValue` |
|
|
2375
|
+
| 默认 `valueParser` | `parseSwitchEditorRawValue` |
|
|
2376
|
+
| 样式类 | `.mg-switch-editor` · `.mg-inline-switch`;尺寸随 `--mg-checkbox-size` token |
|
|
2377
|
+
|
|
2378
|
+
**自定义写回值**(`switchEditorParams`):
|
|
2379
|
+
|
|
2380
|
+
```ts
|
|
2381
|
+
interface SwitchEditorParams {
|
|
2382
|
+
/** 开启态写回值;默认 `true` */
|
|
2383
|
+
onValue?: unknown
|
|
2384
|
+
/** 未开启态写回值;默认 `false` */
|
|
2385
|
+
offValue?: unknown
|
|
2386
|
+
}
|
|
2387
|
+
```
|
|
2388
|
+
|
|
2389
|
+
```ts
|
|
2390
|
+
const columns: ColumnDef[] = [
|
|
2391
|
+
// inline · 默认 boolean
|
|
2392
|
+
{ prop: 'enabled', label: '启用', width: 88, cellEditorMode: 'inline', cellEditor: 'switch' },
|
|
2393
|
+
// overlay · 写回 ON/OFF 字符串
|
|
2394
|
+
{
|
|
2395
|
+
prop: 'mode',
|
|
2396
|
+
label: '模式',
|
|
2397
|
+
width: 100,
|
|
2398
|
+
editable: true,
|
|
2399
|
+
cellEditor: 'switch',
|
|
2400
|
+
switchEditorParams: { onValue: 'ON', offValue: 'OFF' },
|
|
2401
|
+
},
|
|
2402
|
+
]
|
|
2403
|
+
```
|
|
2404
|
+
|
|
2405
|
+
#### overlay 与 inline 行为对照
|
|
2406
|
+
|
|
2407
|
+
| 维度 | overlay | inline |
|
|
2408
|
+
|------|---------|--------|
|
|
2409
|
+
| 挂载时机 | 进入编辑会话(单击/双击/Enter/API) | `CellCtrl.refreshCell` 常驻 |
|
|
2410
|
+
| DOM 容器 | `.mg-cell-editor-host` | `.mg-cell__inline-editor` |
|
|
2411
|
+
| 非编辑态展示 | formatter / cellRenderer | **忽略** cellRenderer,始终显示编辑器 |
|
|
2412
|
+
| 编辑会话 | 有(pin 行 · `cellEditingStarted/Stopped`) | **无** |
|
|
2413
|
+
| 提交触发 | Enter / blur / Tab / 控件 change | `@change` / 单击单元格 / Space(checkbox/switch) |
|
|
2414
|
+
| Tab | 提交并链式下一 editable 格 | 仅移动焦点 |
|
|
2415
|
+
| Esc | 取消 draft | 无 draft;committing 期间 Esc 可 abort |
|
|
2416
|
+
| 行编辑 `editBehavior: 'row'` | 参与整行编辑 | **排除**(不参与整行编辑器挂载) |
|
|
2417
|
+
| 适用编辑器 | 全部内置 + Vue 第三方 | 推荐 `text` / `number` / `checkbox` / `switch` |
|
|
2418
|
+
|
|
2419
|
+
> **注意**:inline 模式搭配依赖 teleport/下拉的第三方组件(如 Select、DatePicker)时,开发环境会 `console.warn`;此类列应使用 overlay + `useCellEditor({ strategy: 'overlay' })`。
|
|
2420
|
+
|
|
2421
|
+
#### 与行选择列的区别
|
|
2422
|
+
|
|
2423
|
+
行选择列(`rowSelection`)与 inline checkbox **UI 相似但职责完全不同**:
|
|
2424
|
+
|
|
2425
|
+
| 维度 | 行选择列 `__select__` | inline checkbox / switch 列 |
|
|
2426
|
+
|------|----------------------|----------------------------|
|
|
2427
|
+
| 状态源 | `SelectionService` | `row.data[prop]` |
|
|
2428
|
+
| 事件 | `selectionChanged` | `cellValueChanged` |
|
|
2429
|
+
| 管线 | 无 valueParser / valueSetter | 完整编辑管线(校验 · async 写回) |
|
|
2430
|
+
| DOM 类名 | `mg-selection-checkbox` | `mg-inline-checkbox` / `mg-inline-switch` |
|
|
2431
|
+
| 表头 | 多选时全选 checkbox | 用户自定义 label |
|
|
2432
|
+
|
|
2433
|
+
#### 样式与 CSS 变量
|
|
2434
|
+
|
|
2435
|
+
内置 checkbox / switch 尺寸与主题色可通过 CSS 变量覆盖(需已引入 `style.css`):
|
|
2436
|
+
|
|
2437
|
+
| Token | 默认值 | 作用 |
|
|
2438
|
+
|-------|--------|------|
|
|
2439
|
+
| `--mg-checkbox-size` | `14px` | checkbox 边长;switch 宽高按比例推导 |
|
|
2440
|
+
| `--mg-color-primary` | 主题主色 | checkbox `accent-color` · switch 开启态背景 |
|
|
2441
|
+
| `--mg-color-border` | 边框色 | switch 关闭态背景 |
|
|
2442
|
+
|
|
2443
|
+
相关类名:`.mg-cell--inline-editor` · `.mg-cell--inline-disabled` · `.mg-cell--committing`(async 提交中)。
|
|
2444
|
+
|
|
2445
|
+
#### 完整示例
|
|
2446
|
+
|
|
2447
|
+
```vue
|
|
2448
|
+
<script setup lang="ts">
|
|
2449
|
+
import { ref } from 'vue'
|
|
2450
|
+
import { MagicGrid } from '@taocompany/magic-grid'
|
|
2451
|
+
import type { ColumnDef, RowData } from '@taocompany/magic-grid/types/core'
|
|
2452
|
+
import '@taocompany/magic-grid/style.css'
|
|
2453
|
+
|
|
2454
|
+
interface ProductRow extends RowData {
|
|
2455
|
+
name: string
|
|
2456
|
+
qty: number | null
|
|
2457
|
+
active: boolean
|
|
2458
|
+
activeFlag: number
|
|
2459
|
+
confirmed: string
|
|
2460
|
+
enabled: boolean
|
|
2461
|
+
mode: string
|
|
2462
|
+
}
|
|
2463
|
+
|
|
2464
|
+
const data = ref<ProductRow[]>([
|
|
2465
|
+
{ id: 1, name: '商品 A', qty: 10, active: true, activeFlag: 1, confirmed: 'Y', enabled: true, mode: 'ON' },
|
|
2466
|
+
{ id: 2, name: '商品 B', qty: null, active: false, activeFlag: 0, confirmed: 'N', enabled: false, mode: 'OFF' },
|
|
2467
|
+
])
|
|
2468
|
+
|
|
2469
|
+
const columns: ColumnDef[] = [
|
|
2470
|
+
{ prop: 'name', label: '名称', width: 140, editable: true, cellEditor: 'text' },
|
|
2471
|
+
{ prop: 'qty', label: '库存', width: 88, cellEditorMode: 'inline', cellEditor: 'number', editable: true },
|
|
2472
|
+
{ prop: 'active', label: '上架', width: 72, cellEditorMode: 'inline', cellEditor: 'checkbox' },
|
|
2473
|
+
{
|
|
2474
|
+
prop: 'activeFlag',
|
|
2475
|
+
label: '标记',
|
|
2476
|
+
width: 72,
|
|
2477
|
+
cellEditorMode: 'inline',
|
|
2478
|
+
cellEditor: 'checkbox',
|
|
2479
|
+
checkboxEditorParams: { checkedValue: 1, uncheckedValue: 0 },
|
|
2480
|
+
},
|
|
2481
|
+
{
|
|
2482
|
+
prop: 'confirmed',
|
|
2483
|
+
label: '确认',
|
|
2484
|
+
width: 80,
|
|
2485
|
+
editable: true,
|
|
2486
|
+
cellEditor: 'checkbox',
|
|
2487
|
+
checkboxEditorParams: { checkedValue: 'Y', uncheckedValue: 'N' },
|
|
2488
|
+
},
|
|
2489
|
+
{ prop: 'enabled', label: '启用', width: 88, cellEditorMode: 'inline', cellEditor: 'switch' },
|
|
2490
|
+
{
|
|
2491
|
+
prop: 'mode',
|
|
2492
|
+
label: '模式',
|
|
2493
|
+
width: 100,
|
|
2494
|
+
editable: true,
|
|
2495
|
+
cellEditor: 'switch',
|
|
2496
|
+
switchEditorParams: { onValue: 'ON', offValue: 'OFF' },
|
|
2497
|
+
},
|
|
2498
|
+
]
|
|
2194
2499
|
|
|
2195
|
-
|
|
2500
|
+
function onCellValueChanged(event: { colId: string; rowId: string | number; oldValue: unknown; newValue: unknown }) {
|
|
2501
|
+
console.log(`${event.colId}: ${String(event.oldValue)} → ${String(event.newValue)}`)
|
|
2502
|
+
}
|
|
2503
|
+
</script>
|
|
2504
|
+
|
|
2505
|
+
<template>
|
|
2506
|
+
<MagicGrid
|
|
2507
|
+
:columns="columns"
|
|
2508
|
+
:data="data"
|
|
2509
|
+
row-key="id"
|
|
2510
|
+
height="360"
|
|
2511
|
+
@cell-value-changed="onCellValueChanged"
|
|
2512
|
+
/>
|
|
2513
|
+
</template>
|
|
2514
|
+
```
|
|
2515
|
+
|
|
2516
|
+
#### 提交管线(内置编辑器共用)
|
|
2517
|
+
|
|
2518
|
+
无论 overlay 还是 inline,提交均走统一管线:
|
|
2519
|
+
|
|
2520
|
+
```
|
|
2521
|
+
控件读值 (getValue / readCheckboxControlValue / readSwitchControlValue)
|
|
2522
|
+
→ valueParser(列级优先;内置编辑器有默认 parser)
|
|
2523
|
+
→ cellValidator / validationRules
|
|
2524
|
+
→ valueSetter(支持 async · signal · cancelCommit)
|
|
2525
|
+
→ applyTransaction 写回 row.data
|
|
2526
|
+
→ cellValueChanged
|
|
2527
|
+
```
|
|
2528
|
+
|
|
2529
|
+
- **校验失败** 或 **valueSetter 返回 false**:按 `invalidEditValueMode`(`keep` / `revert` / `block`)处理;inline checkbox/switch 会 **revert 控件 checked 态**。
|
|
2530
|
+
- **async valueSetter**:提交期间单元格加 `.mg-cell--committing`,控件 disabled;Esc 可 `cancelCommit()` abort。
|
|
2531
|
+
|
|
2532
|
+
更深入的 inline 架构说明见 [docs/24-phase13-inline-cell-editor.md](docs/24-phase13-inline-cell-editor.md)。
|
|
2196
2533
|
|
|
2197
2534
|
### Vue 自定义编辑器
|
|
2198
2535
|
|
|
@@ -2247,7 +2584,9 @@ const columns: ColumnDef[] = [
|
|
|
2247
2584
|
]
|
|
2248
2585
|
```
|
|
2249
2586
|
|
|
2250
|
-
`CellEditorParams` 主要字段:`value`、`data`、`stopEditing(commit?)`、`validate()`、`cancelCommit()`、`setGetValue`、`setKeyboardPolicy`、`inline`、`commit`(inline 模式)。
|
|
2587
|
+
`CellEditorParams` 主要字段:`value`、`data`、`size`(Grid 尺寸 preset)、`stopEditing(commit?)`、`validate()`、`cancelCommit()`、`setGetValue`、`setKeyboardPolicy`、`inline`、`commit`(inline 模式)。
|
|
2588
|
+
|
|
2589
|
+
第三方 UI 库的控件尺寸由消费端自行映射 `params.size` 或使用 Grid CSS 变量(如 `--mg-row-height`、`--mg-font-size`),框架不提供映射 helper。
|
|
2251
2590
|
|
|
2252
2591
|
### 命名编辑器注册表
|
|
2253
2592
|
|
|
@@ -2347,7 +2686,7 @@ api.clearValidation()
|
|
|
2347
2686
|
| `Ctrl/Cmd` + 方向键 | 跳转到首/末行或导航序首/末列 |
|
|
2348
2687
|
| `Tab` / `Shift+Tab` | 下一 / 上一可聚焦格(表头 ↔ 表体可衔接,`navigateHeader` / `navigateFooter` 控制) |
|
|
2349
2688
|
| `Enter` | 表头:排序 / 全选;索引列:定位;树/分组:展开折叠;数据格:进入编辑 |
|
|
2350
|
-
| `Space` | 行选择 checkbox;inline checkbox 切换;表头/索引/树/分组同 Enter 的切换逻辑 |
|
|
2689
|
+
| `Space` | 行选择 checkbox;inline checkbox/switch 切换;表头/索引/树/分组同 Enter 的切换逻辑 |
|
|
2351
2690
|
| `F2` | 进入编辑(若列可编辑) |
|
|
2352
2691
|
| `Shift+F2` | 新建/打开单元格批注(批注功能启用时) |
|
|
2353
2692
|
|
|
@@ -2715,7 +3054,7 @@ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid/types/co
|
|
|
2715
3054
|
**单元格编辑器**
|
|
2716
3055
|
|
|
2717
3056
|
- `useCellEditor`、`VueCellEditorHost`、`createVueCellEditor`、`createSlotCellEditor`
|
|
2718
|
-
- `textCellEditor`、`numberCellEditor`、`checkboxCellEditor`(内置实现,高级场景)
|
|
3057
|
+
- `textCellEditor`、`numberCellEditor`、`checkboxCellEditor`、`switchCellEditor`(内置实现,高级场景)
|
|
2719
3058
|
- `registerCellEditor` / `unregisterCellEditor` / `getCellEditor` / `hasCellEditor` / `getRegisteredCellEditorNames`
|
|
2720
3059
|
- `BUILTIN_CELL_EDITOR_NAMES`、`isBuiltInCellEditor`
|
|
2721
3060
|
- `DEFAULT_CELL_EDITOR_MODE`、`resolveCellEditorMode`、`isInlineEditorColumn`
|
|
@@ -2761,15 +3100,16 @@ import type { MagicGridProps } from '@taocompany/magic-grid/types/core'
|
|
|
2761
3100
|
### 组件 ref 类型
|
|
2762
3101
|
|
|
2763
3102
|
```ts
|
|
2764
|
-
import type { MagicGridExpose
|
|
3103
|
+
import type { MagicGridExpose } from '@taocompany/magic-grid/types/core'
|
|
2765
3104
|
|
|
2766
3105
|
const gridRef = ref<MagicGridExpose>()
|
|
2767
|
-
|
|
3106
|
+
// 命令式:gridRef.value?.api?.getData()
|
|
3107
|
+
// 初始化:@grid-ready="({ api }) => ..."
|
|
2768
3108
|
```
|
|
2769
3109
|
|
|
2770
3110
|
### 事件 payload
|
|
2771
3111
|
|
|
2772
|
-
事件回调参数类型均从 `@taocompany/magic-grid/types/core` 导出,例如 `CellValueChangedEvent`、`
|
|
3112
|
+
事件回调参数类型均从 `@taocompany/magic-grid/types/core` 导出,例如 `GridReadyEvent`、`CellValueChangedEvent`、`FilterModel`。
|
|
2773
3113
|
|
|
2774
3114
|
### 严格模式建议
|
|
2775
3115
|
|
|
@@ -2861,48 +3201,6 @@ import {
|
|
|
2861
3201
|
|
|
2862
3202
|
---
|
|
2863
3203
|
|
|
2864
|
-
|
|
2865
|
-
## 本地开发与 Playground
|
|
2866
|
-
|
|
2867
|
-
### 环境
|
|
2868
|
-
|
|
2869
|
-
```bash
|
|
2870
|
-
pnpm install
|
|
2871
|
-
pnpm dev # 启动 Playground(默认 Vite dev server)
|
|
2872
|
-
pnpm build # 构建 npm 包至 dist/
|
|
2873
|
-
pnpm test:run # 单元测试
|
|
2874
|
-
pnpm typecheck # Vue + TS 类型检查
|
|
2875
|
-
```
|
|
2876
|
-
|
|
2877
|
-
要求 Node.js >= 20.19,包管理器推荐 pnpm 11.x。
|
|
2878
|
-
|
|
2879
|
-
### Playground 路由
|
|
2880
|
-
|
|
2881
|
-
开发服务器按 Phase 组织演示页,便于逐项验收能力:
|
|
2882
|
-
|
|
2883
|
-
| 路由 | 主题 |
|
|
2884
|
-
|------|------|
|
|
2885
|
-
| `/phase2` – `/phase27` | 各 Phase 功能演示与验收用例 |
|
|
2886
|
-
| `/phase41` | Cell Renderer 滚动性能(5000 行 × 多 `#cell-xxx` · pending 指标 · 调参) |
|
|
2887
|
-
| `/glossary` | 术语表 |
|
|
2888
|
-
|
|
2889
|
-
典型入口:`pnpm dev` 后访问控制台输出的本地 URL,从侧边栏切换 Phase。例如列显隐验收 **`/phase22`**(T14–T15 · `available` 列切换);多 Vue slot 列滚停拖尾验收 **`/phase41`**。
|
|
2890
|
-
|
|
2891
|
-
Playground 源码位于仓库 `playground/` 目录;自定义 Vue 编辑器示例见 `playground/components/editors/`(Element Plus 集成参考)。
|
|
2892
|
-
|
|
2893
|
-
### 构建产物
|
|
2894
|
-
|
|
2895
|
-
`pnpm build` 输出:
|
|
2896
|
-
|
|
2897
|
-
- `dist/index.es.js` / `dist/index.cjs.js` — 主包
|
|
2898
|
-
- `dist/types/*.js` — 类型子路径运行时垫片
|
|
2899
|
-
- `dist/style.css` — 样式
|
|
2900
|
-
- `dist/*.d.ts` — 类型声明(api-extractor rollup)
|
|
2901
|
-
|
|
2902
|
-
发布前会自动执行 `prepublishOnly` → `pnpm run build`。
|
|
2903
|
-
|
|
2904
|
-
---
|
|
2905
|
-
|
|
2906
3204
|
## License
|
|
2907
3205
|
|
|
2908
3206
|
MIT © [songjiuzhang](mailto:jiuzhang.song@taoandcompany02.com)
|