king-design-analyzer 2.1.9 → 2.2.0

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.
Files changed (305) hide show
  1. package/components/actions.json +101 -0
  2. package/components/advancedset.json +127 -0
  3. package/components/affix.json +7 -0
  4. package/components/aksk.json +172 -0
  5. package/components/az.json +15 -2
  6. package/components/badge.json +7 -0
  7. package/components/billtypes.json +14 -2
  8. package/components/breadcrumb.json +7 -0
  9. package/components/button.json +191 -0
  10. package/components/buttonlink.json +73 -0
  11. package/components/card.json +8 -1
  12. package/components/cardcol.json +142 -0
  13. package/components/cardcols.json +121 -0
  14. package/components/cardcontent.json +15 -3
  15. package/components/cardtabs.json +172 -0
  16. package/components/carousel.json +7 -0
  17. package/components/cascader.json +520 -368
  18. package/components/checkbox.json +51 -4
  19. package/components/cidrinput.json +140 -0
  20. package/components/code.json +8 -1
  21. package/components/collapse.json +7 -0
  22. package/components/colorpicker.json +217 -0
  23. package/components/copy.json +7 -0
  24. package/components/copyhover.json +111 -0
  25. package/components/copyrow.json +124 -0
  26. package/components/datepicker.json +656 -524
  27. package/components/description.json +98 -0
  28. package/components/dialog.json +522 -455
  29. package/components/divider.json +8 -1
  30. package/components/drawer.json +571 -558
  31. package/components/dropdown.json +464 -384
  32. package/components/duration.json +125 -0
  33. package/components/editable.json +66 -0
  34. package/components/ellipsis.json +34 -1
  35. package/components/filtertablefieldsdialog.json +128 -0
  36. package/components/flex.json +151 -0
  37. package/components/form.json +131 -0
  38. package/components/formiteminput.json +214 -0
  39. package/components/formitemspinner.json +213 -0
  40. package/components/formitemswitch.json +185 -0
  41. package/components/formitemtableconfigs.json +210 -0
  42. package/components/grid.json +7 -0
  43. package/components/header.json +161 -0
  44. package/components/icon.json +13 -1
  45. package/components/icontooltip.json +19 -1
  46. package/components/input.json +188 -4
  47. package/components/instancelist.json +194 -0
  48. package/components/instancenum.json +196 -0
  49. package/components/ipinput.json +117 -0
  50. package/components/kspstatus.json +205 -0
  51. package/components/kvcode.json +120 -0
  52. package/components/layoutcontent.json +15 -3
  53. package/components/layoutlistcontent.json +148 -0
  54. package/components/layoutpermissioncontent.json +155 -0
  55. package/components/layoutstandardlist.json +275 -0
  56. package/components/layouttabs.json +168 -0
  57. package/components/lazymount.json +86 -0
  58. package/components/lazyteleport.json +118 -0
  59. package/components/menu.json +7 -0
  60. package/components/pagination.json +12 -0
  61. package/components/paginationplus.json +30 -3
  62. package/components/password.json +121 -0
  63. package/components/popover.json +457 -437
  64. package/components/projects.json +129 -0
  65. package/components/protable.json +97 -8
  66. package/components/queuevisualrange.json +110 -0
  67. package/components/radio.json +82 -2
  68. package/components/rate.json +199 -0
  69. package/components/region.json +14 -2
  70. package/components/search.json +221 -0
  71. package/components/searchinput.json +132 -0
  72. package/components/searchitems.json +215 -0
  73. package/components/searchselect.json +195 -0
  74. package/components/select.json +686 -666
  75. package/components/sidebar.json +198 -0
  76. package/components/skeleton.json +233 -0
  77. package/components/spin.json +8 -1
  78. package/components/split.json +260 -0
  79. package/components/sshkeys.json +138 -0
  80. package/components/status.json +60 -3
  81. package/components/steps.json +7 -0
  82. package/components/switch.json +8 -1
  83. package/components/table.json +18 -1
  84. package/components/tablecolumnid.json +14 -2
  85. package/components/tabs.json +12 -0
  86. package/components/timeline.json +213 -0
  87. package/components/timepicker.json +147 -3
  88. package/components/timerange.json +262 -0
  89. package/components/tip.json +7 -0
  90. package/components/tooltip.json +484 -395
  91. package/components/tour.json +418 -372
  92. package/components/transfer.json +27 -3
  93. package/components/tree.json +6 -4
  94. package/components/treeselect.json +556 -475
  95. package/components/upload.json +474 -473
  96. package/components/vdialog.json +308 -0
  97. package/components/vdrawer.json +331 -0
  98. package/components/virtuallist.json +7 -0
  99. package/dist/ast/index.d.mts +35 -1
  100. package/dist/ast/index.d.ts +35 -1
  101. package/dist/ast/index.js +4 -3
  102. package/dist/ast/index.mjs +2 -1
  103. package/dist/{chunk-DSWKLUIX.mjs → chunk-3LYQ5XFM.mjs} +1 -1
  104. package/dist/chunk-BI5TIQID.mjs +330 -0
  105. package/dist/{chunk-F26GUCGG.js → chunk-CJGGFVQJ.js} +8 -8
  106. package/dist/chunk-CR3GC4H3.js +353 -0
  107. package/dist/{chunk-NZ6TLWMD.mjs → chunk-D2SXGGTX.mjs} +28 -17
  108. package/dist/{chunk-D3Y6FGWA.js → chunk-EYKZY2F3.js} +29 -18
  109. package/dist/chunk-KF5YBEM5.js +143 -0
  110. package/dist/{chunk-H2ET6MMM.mjs → chunk-KMIDURUR.mjs} +42 -47
  111. package/dist/chunk-QC6VTSA3.mjs +117 -0
  112. package/dist/{chunk-2W6OCG2S.js → chunk-SZYVGYKK.js} +42 -48
  113. package/dist/{chunk-WYSRJVX4.js → chunk-TA3SV4SP.js} +2 -2
  114. package/dist/{chunk-OJOHB64C.mjs → chunk-XGPHQHLR.mjs} +4 -4
  115. package/dist/full/index.js +7 -6
  116. package/dist/full/index.mjs +5 -4
  117. package/dist/index.d.mts +1 -0
  118. package/dist/index.d.ts +1 -0
  119. package/dist/index.js +14 -13
  120. package/dist/index.mjs +6 -5
  121. package/dist/metadata/index.d.mts +22 -2
  122. package/dist/metadata/index.d.ts +22 -2
  123. package/dist/metadata/index.js +26 -16
  124. package/dist/metadata/index.mjs +26 -15
  125. package/dist/resolve-BsLBxlBi.d.mts +24 -0
  126. package/dist/resolve-BsLBxlBi.d.ts +24 -0
  127. package/dist/runtime/index.js +4 -4
  128. package/dist/runtime/index.mjs +2 -2
  129. package/dist/shared/index.d.mts +10 -0
  130. package/dist/shared/index.d.ts +10 -0
  131. package/dist/shared/index.js +23 -0
  132. package/dist/shared/index.mjs +2 -0
  133. package/dist/static/index.js +5 -5
  134. package/dist/static/index.mjs +2 -2
  135. package/docs_for_llm/actions.doc.md +77 -0
  136. package/docs_for_llm/advancedset.doc.md +89 -0
  137. package/docs_for_llm/affix.doc.md +15 -7
  138. package/docs_for_llm/aksk.doc.md +111 -0
  139. package/docs_for_llm/az.doc.md +17 -11
  140. package/docs_for_llm/badge.doc.md +6 -5
  141. package/docs_for_llm/billtypes.doc.md +17 -11
  142. package/docs_for_llm/breadcrumb.doc.md +6 -3
  143. package/docs_for_llm/button.doc.md +34 -18
  144. package/docs_for_llm/buttonlink.doc.md +55 -0
  145. package/docs_for_llm/card.doc.md +8 -5
  146. package/docs_for_llm/cardcol.doc.md +78 -0
  147. package/docs_for_llm/cardcols.doc.md +84 -0
  148. package/docs_for_llm/cardcontent.doc.md +10 -10
  149. package/docs_for_llm/cardtabs.doc.md +106 -0
  150. package/docs_for_llm/carousel.doc.md +8 -7
  151. package/docs_for_llm/cascader.doc.md +46 -25
  152. package/docs_for_llm/checkbox.doc.md +25 -13
  153. package/docs_for_llm/cidrinput.doc.md +83 -0
  154. package/docs_for_llm/code.doc.md +22 -11
  155. package/docs_for_llm/collapse.doc.md +9 -6
  156. package/docs_for_llm/colorpicker.doc.md +104 -0
  157. package/docs_for_llm/copy.doc.md +15 -13
  158. package/docs_for_llm/copyhover.doc.md +59 -0
  159. package/docs_for_llm/copyrow.doc.md +71 -0
  160. package/docs_for_llm/datepicker.doc.md +51 -39
  161. package/docs_for_llm/description.doc.md +75 -0
  162. package/docs_for_llm/descriptions.doc.md +9 -6
  163. package/docs_for_llm/dialog.doc.md +48 -77
  164. package/docs_for_llm/divider.doc.md +9 -7
  165. package/docs_for_llm/drawer.doc.md +43 -84
  166. package/docs_for_llm/dropdown.doc.md +52 -21
  167. package/docs_for_llm/duration.doc.md +76 -0
  168. package/docs_for_llm/editable.doc.md +36 -14
  169. package/docs_for_llm/ellipsis.doc.md +10 -5
  170. package/docs_for_llm/filtertablefieldsdialog.doc.md +99 -0
  171. package/docs_for_llm/flex.doc.md +74 -0
  172. package/docs_for_llm/form.doc.md +33 -14
  173. package/docs_for_llm/formiteminput.doc.md +128 -0
  174. package/docs_for_llm/formitemspinner.doc.md +105 -0
  175. package/docs_for_llm/formitemswitch.doc.md +113 -0
  176. package/docs_for_llm/formitemtableconfigs.doc.md +95 -0
  177. package/docs_for_llm/grid.doc.md +7 -5
  178. package/docs_for_llm/header.doc.md +85 -0
  179. package/docs_for_llm/icon.doc.md +12 -8
  180. package/docs_for_llm/icontooltip.doc.md +121 -0
  181. package/docs_for_llm/input.doc.md +90 -39
  182. package/docs_for_llm/instancelist.doc.md +113 -0
  183. package/docs_for_llm/instancenum.doc.md +95 -0
  184. package/docs_for_llm/ipinput.doc.md +77 -0
  185. package/docs_for_llm/kspstatus.doc.md +82 -0
  186. package/docs_for_llm/kvcode.doc.md +76 -0
  187. package/docs_for_llm/layoutcontent.doc.md +17 -17
  188. package/docs_for_llm/layoutlistcontent.doc.md +95 -0
  189. package/docs_for_llm/layoutpermissioncontent.doc.md +84 -0
  190. package/docs_for_llm/layoutstandardlist.doc.md +120 -0
  191. package/docs_for_llm/layouttabs.doc.md +101 -0
  192. package/docs_for_llm/lazymount.doc.md +73 -0
  193. package/docs_for_llm/lazyteleport.doc.md +76 -0
  194. package/docs_for_llm/menu.doc.md +14 -11
  195. package/docs_for_llm/message.doc.md +48 -10
  196. package/docs_for_llm/pagination.doc.md +30 -17
  197. package/docs_for_llm/paginationplus.doc.md +31 -10
  198. package/docs_for_llm/password.doc.md +86 -0
  199. package/docs_for_llm/popover.doc.md +24 -55
  200. package/docs_for_llm/progress.doc.md +13 -10
  201. package/docs_for_llm/projects.doc.md +91 -0
  202. package/docs_for_llm/protable.doc.md +89 -15
  203. package/docs_for_llm/queuevisualrange.doc.md +78 -0
  204. package/docs_for_llm/radio.doc.md +23 -8
  205. package/docs_for_llm/rate.doc.md +122 -0
  206. package/docs_for_llm/region.doc.md +25 -13
  207. package/docs_for_llm/search.doc.md +120 -0
  208. package/docs_for_llm/searchinput.doc.md +111 -0
  209. package/docs_for_llm/searchitems.doc.md +116 -0
  210. package/docs_for_llm/searchselect.doc.md +126 -0
  211. package/docs_for_llm/select.doc.md +40 -55
  212. package/docs_for_llm/sidebar.doc.md +133 -0
  213. package/docs_for_llm/skeleton.doc.md +117 -0
  214. package/docs_for_llm/slider.doc.md +31 -21
  215. package/docs_for_llm/spin.doc.md +8 -5
  216. package/docs_for_llm/spinner.doc.md +28 -18
  217. package/docs_for_llm/split.doc.md +157 -0
  218. package/docs_for_llm/sshkeys.doc.md +88 -0
  219. package/docs_for_llm/status.doc.md +14 -9
  220. package/docs_for_llm/steps.doc.md +10 -7
  221. package/docs_for_llm/switch.doc.md +17 -14
  222. package/docs_for_llm/table.doc.md +118 -51
  223. package/docs_for_llm/tablecolumnid.doc.md +36 -16
  224. package/docs_for_llm/tabs.doc.md +19 -10
  225. package/docs_for_llm/tag.doc.md +19 -10
  226. package/docs_for_llm/timeline.doc.md +109 -0
  227. package/docs_for_llm/timepicker.doc.md +57 -38
  228. package/docs_for_llm/timerange.doc.md +157 -0
  229. package/docs_for_llm/tip.doc.md +20 -11
  230. package/docs_for_llm/tooltip.doc.md +55 -29
  231. package/docs_for_llm/tour.doc.md +48 -29
  232. package/docs_for_llm/transfer.doc.md +40 -29
  233. package/docs_for_llm/tree.doc.md +65 -23
  234. package/docs_for_llm/treeselect.doc.md +37 -48
  235. package/docs_for_llm/upload.doc.md +56 -32
  236. package/docs_for_llm/useCRUD.doc.md +49 -0
  237. package/docs_for_llm/useCountdown.doc.md +43 -0
  238. package/docs_for_llm/useDetail.doc.md +48 -0
  239. package/docs_for_llm/useDialog.doc.md +46 -0
  240. package/docs_for_llm/useEntity.doc.md +45 -0
  241. package/docs_for_llm/useEventListener.doc.md +44 -0
  242. package/docs_for_llm/useFalseUntilTruthy.doc.md +41 -0
  243. package/docs_for_llm/useGetCopyAuthText.doc.md +35 -0
  244. package/docs_for_llm/useGetUserPermission.doc.md +43 -0
  245. package/docs_for_llm/useGroup.doc.md +48 -0
  246. package/docs_for_llm/useIdEntities.doc.md +48 -0
  247. package/docs_for_llm/useIdEntity.doc.md +103 -0
  248. package/docs_for_llm/useInterval.doc.md +43 -0
  249. package/docs_for_llm/useLayoutStandardList.doc.md +38 -0
  250. package/docs_for_llm/useMessage.doc.md +46 -0
  251. package/docs_for_llm/useModifyCache.doc.md +37 -0
  252. package/docs_for_llm/useOpenDialog.doc.md +41 -0
  253. package/docs_for_llm/usePagination.doc.md +60 -0
  254. package/docs_for_llm/usePersist.doc.md +54 -0
  255. package/docs_for_llm/usePoll.doc.md +41 -0
  256. package/docs_for_llm/useRoutePlus.doc.md +34 -0
  257. package/docs_for_llm/useRouterPlus.doc.md +34 -0
  258. package/docs_for_llm/useSearch.doc.md +68 -0
  259. package/docs_for_llm/useShell.doc.md +43 -0
  260. package/docs_for_llm/useSkip.doc.md +41 -0
  261. package/docs_for_llm/useStorageIdEntity.doc.md +46 -0
  262. package/docs_for_llm/useStore.doc.md +34 -0
  263. package/docs_for_llm/useTable.doc.md +57 -0
  264. package/docs_for_llm/useTableGroup.doc.md +47 -0
  265. package/docs_for_llm/useTableSort.doc.md +40 -0
  266. package/docs_for_llm/useToState.doc.md +112 -0
  267. package/docs_for_llm/useUser.doc.md +38 -0
  268. package/docs_for_llm/useValidForm.doc.md +41 -0
  269. package/docs_for_llm/vdialog.doc.md +129 -0
  270. package/docs_for_llm/vdrawer.doc.md +119 -0
  271. package/docs_for_llm/virtuallist.doc.md +6 -3
  272. package/hooks/useCRUD.json +61 -0
  273. package/hooks/useCountdown.json +49 -0
  274. package/hooks/useDetail.json +67 -0
  275. package/hooks/useDialog.json +49 -0
  276. package/hooks/useEntity.json +61 -0
  277. package/hooks/useEventListener.json +61 -0
  278. package/hooks/useFalseUntilTruthy.json +43 -0
  279. package/hooks/useGetCopyAuthText.json +36 -0
  280. package/hooks/useGetUserPermission.json +55 -0
  281. package/hooks/useGroup.json +49 -0
  282. package/hooks/useIdEntities.json +61 -0
  283. package/hooks/useInterval.json +55 -0
  284. package/hooks/useLayoutStandardList.json +36 -0
  285. package/hooks/useMessage.json +73 -0
  286. package/hooks/useModifyCache.json +36 -0
  287. package/hooks/useOpenDialog.json +43 -0
  288. package/hooks/usePagination.json +49 -0
  289. package/hooks/usePersist.json +61 -0
  290. package/hooks/usePoll.json +43 -0
  291. package/hooks/useRoutePlus.json +36 -0
  292. package/hooks/useRouterPlus.json +36 -0
  293. package/hooks/useSearch.json +56 -0
  294. package/hooks/useShell.json +49 -0
  295. package/hooks/useSkip.json +43 -0
  296. package/hooks/useStorageIdEntity.json +67 -0
  297. package/hooks/useStore.json +36 -0
  298. package/hooks/useTable.json +49 -0
  299. package/hooks/useTableGroup.json +43 -0
  300. package/hooks/useTableSort.json +43 -0
  301. package/hooks/useUser.json +36 -0
  302. package/hooks/useValidForm.json +43 -0
  303. package/package.json +12 -6
  304. package/dist/chunk-HPAUCD5I.js +0 -156
  305. package/dist/chunk-L4DS3EXI.mjs +0 -133
@@ -0,0 +1,57 @@
1
+ # 表格状态管理 (useTable)
2
+
3
+ 集中管理表格勾选、展开、列显隐和导出相关状态,适合原子 Table 和业务表格容器共享同一套表格控制逻辑。
4
+
5
+ **关键词**: useTable, Table, 勾选状态, 列显隐, 导出表格, rowKey
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useTable } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | options | `{ rowKey?: string; notCheckTip?: string; tableFields?: TableFields }` | 否 | 表格配置,可指定 rowKey、未勾选提示文案和列配置定义 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { checkedKeys: Ref<string[]>; expandedKeys: Ref<(string | number)[]>; isChecked: ComputedRef<number>; canCheck: ComputedRef<{ disabled: boolean; msg: string }>; tableRef: Ref<Table | undefined>; componentRef: Ref<any>; noCheckedColFields: Ref<string[]>; setRowKey: Function; exportTableData: Function; hideCol: Function; getTableColTitle: ((key: string) => string) | null; initTableColumnProps: Function; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 多选或导出场景没有稳定 rowKey,导致勾选数据不稳定
24
+ > **错误用法**: `const table = useTable();`
25
+ > **正确写法**: `const table = useTable({ rowKey: 'id' });`
26
+ > **说明**: 在业务表格中建议显式指定 rowKey,避免勾选项和导出数据映射错乱。
27
+
28
+ ## 使用示例
29
+ ### 管理表格勾选和列显隐
30
+ 在列表页中集中维护勾选状态和动态列配置
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { useTable } from '@ksyun-internal/versatile';
35
+
36
+ const tableFields = [
37
+ { key: 'name', label: '实例名称', checked: true },
38
+ { key: 'status', label: '状态', checked: true },
39
+ ];
40
+ const { checkedKeys, tableRef, canCheck, initTableColumnProps } = useTable({
41
+ rowKey: 'id',
42
+ tableFields,
43
+ });
44
+ </script>
45
+ ```
46
+
47
+ ### 导出当前表格数据
48
+ 通过 hook 暴露的导出方法触发表格导出
49
+
50
+ ```vue
51
+ <script setup lang="ts">
52
+ import { useTable } from '@ksyun-internal/versatile';
53
+
54
+ const { exportTableData } = useTable({ rowKey: 'id' });
55
+ </script>
56
+ ```
57
+
@@ -0,0 +1,47 @@
1
+ # 表格分组筛选状态 (useTableGroup)
2
+
3
+ 管理 Table 或 ProTable 的 group 筛选状态,并可与 SearchItems 联动生成可展示的筛选项。
4
+
5
+ **关键词**: useTableGroup, group, ProTable, 表格筛选, SearchItems, 状态分组
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useTableGroup } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | options | `{ page?: Ref<number>; key?: string; defalutValue?: any; searchItemsRef?: Ref<any>; labelMaps?: Record<string, string> | Ref<Record<string, string>>; groupLabel?: string | Record<string, string | { label: string }>; isShowSearchItem?: boolean }` | 否 | 分组筛选配置,可联动分页、SearchItems 和字段标签映射 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { status: ComputedRef<any>; group: Ref<Record<string, any>>; resetGroup: Function; changeGroup: Function; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### SearchItems 展示 group 条件时没有提供 labelMaps 或 groupLabel
24
+ > **错误用法**: `useTableGroup({ searchItemsRef });`
25
+ > **正确写法**: `useTableGroup({ searchItemsRef, labelMaps, groupLabel: '状态' });`
26
+ > **说明**: 如果要把 group 同步到 SearchItems,建议补齐展示文案映射。
27
+
28
+ ## 使用示例
29
+ ### 配合 ProTable 的 group 筛选
30
+ 将 group 状态和 SearchItems 联动,统一驱动表格筛选
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { ref } from 'vue';
35
+ import { usePagination, useTableGroup } from '@ksyun-internal/versatile';
36
+
37
+ const { page } = usePagination();
38
+ const searchItemsRef = ref();
39
+ const { group, changeGroup, resetGroup } = useTableGroup({
40
+ page,
41
+ key: 'status',
42
+ searchItemsRef,
43
+ labelMaps: { using: '运行中', shutdown: '已关机' },
44
+ });
45
+ </script>
46
+ ```
47
+
@@ -0,0 +1,40 @@
1
+ # 表格排序状态 (useTableSort)
2
+
3
+ 统一管理表格排序字段和方向,并提供多种派生排序状态,适合请求参数、UI 高亮和布尔/整数映射场景。
4
+
5
+ **关键词**: useTableSort, 排序, TableSortValue, ProTable, 列表排序, sort
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useTableSort } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | page | `Ref<number | undefined>` | 否 | 分页页码,传入后在切换排序时可联动重置页码 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { sort: Ref<TableSortValue>; curSortKey: ComputedRef<string | undefined>; curSortType: ComputedRef<'desc' | 'asc' | undefined>; curSortTypeByInt: ComputedRef<0 | 1 | -1>; curSortTypeByBoolean: ComputedRef<boolean | ''>; changeSort: Function; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 自己维护 asc/desc 和 0/1/-1 的映射,重复实现 hook 已有能力
24
+ > **错误用法**: `const sortType = computed(() => sort.value.type === 'asc' ? 1 : -1);`
25
+ > **正确写法**: `const { curSortTypeByInt } = useTableSort(page);`
26
+ > **说明**: hook 已经提供多种派生排序表示,优先复用。
27
+
28
+ ## 使用示例
29
+ ### 列表排序状态
30
+ 将排序状态集中管理,并把变更方法绑定给表格
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { usePagination, useTableSort } from '@ksyun-internal/versatile';
35
+
36
+ const { page } = usePagination();
37
+ const { sort, curSortKey, curSortType, changeSort } = useTableSort(page);
38
+ </script>
39
+ ```
40
+
@@ -0,0 +1,112 @@
1
+ # Props 转 State (useToState)
2
+
3
+ 将 props 中的属性转换为响应式 state,支持 v-model 双向绑定。当 props 变化时自动更新 state,当 state 变化时自动触发 emit 更新父组件。
4
+
5
+ **关键词**: useToState, props, state, v-model, 双向绑定, 响应式
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useToState } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | props | `P extends object` | 是 | 组件的 props 对象(通过 defineProps 获取) |
16
+ | key | `keyof P` | 是 | 要监听的 prop 名称(字符串) |
17
+ | emit | `Emits<K & string, P[K]>` | 是 | 组件的 emit 函数(通过 defineEmits 获取),需要包含 update:key 事件 |
18
+ | defaults | `NonNullable<P[K]>` | 否 | 默认值。如果提供,返回的 Ref 将保证不为 undefined |
19
+
20
+ ## 重载签名 (Overloads)
21
+ ### `useToState<P, K>(props: P, key: K, emit: Emits): Ref<P[K]>`
22
+ 基础用法,返回可能为 undefined 的响应式值
23
+
24
+ ### `useToState<P, K>(props: P, key: K, emit: Emits, defaults: NonNullable<P[K]>): Ref<NonNullable<P[K]>>`
25
+ 带默认值用法,返回保证非 undefined 的响应式值
26
+
27
+ ## 返回值
28
+ ```typescript
29
+ Ref<P[K]>
30
+ ```
31
+
32
+ ## 常见错误与正确用法 (Anti-Hallucination)
33
+ ### 忘记传递 emit 参数
34
+ > **错误用法**: `const value = useToState(props, 'modelValue');`
35
+ > **正确写法**: `const value = useToState(props, 'modelValue', emit);`
36
+ > **说明**: useToState 需要 emit 函数来实现双向绑定,缺少 emit 会导致编译错误
37
+
38
+ ### emit 没有定义对应的 update:key 事件
39
+ > **错误用法**: `const emit = defineEmits(['change']);
40
+ const value = useToState(props, 'modelValue', emit);`
41
+ > **正确写法**: `const emit = defineEmits(['update:modelValue']);
42
+ const value = useToState(props, 'modelValue', emit);`
43
+ > **说明**: useToState 内部会调用 emit('update:key', newValue),必须在 defineEmits 中声明对应事件
44
+
45
+ ### key 参数不是 props 中定义的属性
46
+ > **错误用法**: `const props = defineProps<{ name: string }>();
47
+ const value = useToState(props, 'age', emit);`
48
+ > **正确写法**: `const props = defineProps<{ name: string; age?: number }>();
49
+ const value = useToState(props, 'age', emit);`
50
+ > **说明**: key 必须是 props 中已定义的属性名
51
+
52
+ ## 使用示例
53
+ ### 基础用法
54
+ 将 modelValue prop 转换为响应式 state
55
+
56
+ ```vue
57
+ <script setup lang="ts">
58
+ import { useToState } from '@ksyun-internal/versatile';
59
+
60
+ type Props = { modelValue?: string };
61
+ type Emits = { (e: 'update:modelValue', v?: string): void };
62
+
63
+ const props = defineProps<Props>();
64
+ const emit = defineEmits<Emits>();
65
+
66
+ const value = useToState(props, 'modelValue', emit);
67
+ </script>
68
+ <template>
69
+ <input v-model="value" />
70
+ </template>
71
+ ```
72
+
73
+ ### 带默认值用法
74
+ 提供默认值,确保返回值不为 undefined
75
+
76
+ ```vue
77
+ <script setup lang="ts">
78
+ import { useToState } from '@ksyun-internal/versatile';
79
+
80
+ const props = defineProps<{ count?: number }>();
81
+ const emit = defineEmits(['update:count']);
82
+
83
+ // 默认值为 0,count 永远不为 undefined
84
+ const count = useToState(props, 'count', emit, 0);
85
+ </script>
86
+ <template>
87
+ <div>{{ count }}</div>
88
+ </template>
89
+ ```
90
+
91
+ ### 对象类型值
92
+ 将对象类型的 prop 转换为响应式 state
93
+
94
+ ```vue
95
+ <script setup lang="ts">
96
+ import { useToState } from '@ksyun-internal/versatile';
97
+
98
+ type FormData = { name: string; age: number };
99
+ type Props = { modelValue?: FormData };
100
+ type Emits = { (e: 'update:modelValue', v?: FormData): void };
101
+
102
+ const props = defineProps<Props>();
103
+ const emit = defineEmits<Emits>();
104
+
105
+ const formData = useToState(props, 'modelValue', emit, { name: '', age: 0 });
106
+ </script>
107
+ <template>
108
+ <input v-model="formData.name" />
109
+ <input v-model.number="formData.age" />
110
+ </template>
111
+ ```
112
+
@@ -0,0 +1,38 @@
1
+ # 当前用户信息 (useUser)
2
+
3
+ 获取当前登录用户信息,适合在业务组件中读取 root 权限、当前用户 ID 或账号属性。
4
+
5
+ **关键词**: useUser, 当前用户, 权限, isRoot, curUserId, 账号信息
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useUser } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 返回值
13
+ ```typescript
14
+ Ref<UserInfo | undefined>
15
+ ```
16
+
17
+ ## 常见错误与正确用法 (Anti-Hallucination)
18
+ ### 直接访问 user.value 的属性,没有处理未加载完成的情况
19
+ > **错误用法**: `const isRoot = user.value.isRoot;`
20
+ > **正确写法**: `const isRoot = user.value?.isRoot;`
21
+ > **说明**: 返回值是 Ref<UserInfo | undefined>,初始化阶段可能为空。
22
+
23
+ ## 使用示例
24
+ ### 读取当前用户信息
25
+ 在页面初始化时获取当前用户及权限信息
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { useUser } from '@ksyun-internal/versatile';
30
+
31
+ const user = useUser();
32
+ </script>
33
+
34
+ <template>
35
+ <div v-if="user">{{ user.curUserId }}</div>
36
+ </template>
37
+ ```
38
+
@@ -0,0 +1,41 @@
1
+ # 表单校验管理 (useValidForm)
2
+
3
+ 封装 Form 实例的校验、重置和滚动定位能力,适合页面表单和弹窗表单统一管理。
4
+
5
+ **关键词**: useValidForm, 表单校验, Form, validateByScroll, reset, 滚动定位
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useValidForm } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | models | `Ref<T>` | 否 | 表单模型对象,可在 reset 时恢复默认值 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { formRef: Ref<Form | undefined>; validate: Function; validateByScroll: Function; reset: Function; scrollIntoFirstInvalidFormItem: Function; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 希望 reset 恢复初始模型,但没有把 models 传给 hook
24
+ > **错误用法**: `const { reset } = useValidForm();`
25
+ > **正确写法**: `const { reset } = useValidForm(models);`
26
+ > **说明**: 如果需要重置业务表单值,建议把模型 Ref 传入 useValidForm。
27
+
28
+ ## 使用示例
29
+ ### 页面表单校验
30
+ 在提交前统一校验并定位第一个错误项
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { ref } from 'vue';
35
+ import { useValidForm } from '@ksyun-internal/versatile';
36
+
37
+ const models = ref({ name: '', region: '' });
38
+ const { formRef, validateByScroll } = useValidForm(models);
39
+ </script>
40
+ ```
41
+
@@ -0,0 +1,129 @@
1
+ # 业务弹窗 (VDialog)
2
+
3
+ 在基础 Dialog 之上补充默认触发器、受控显隐和异步确认逻辑的业务弹窗组件,适合表单弹窗和危险操作确认。
4
+
5
+ **关键词**: vdialog, dialog, 业务弹窗, 确认弹窗, 表单弹窗, trigger dialog
6
+
7
+ **使用场景**: 表单弹窗、异步确认弹窗、通过按钮触发的操作弹窗
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { VDialog } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | title | `string` | `""` | 否 | 弹窗标题 | - | - |
18
+ | size | `string` | `undefined` | 否 | 弹窗尺寸 | - | - |
19
+ | width | `string | number` | `undefined` | 否 | 弹窗宽度 | - | - |
20
+ | loading | `boolean` | `false` | 否 | 确认按钮加载状态 | - | - |
21
+ | disabledOk | `boolean` | `false` | 否 | 是否禁用确认按钮 | - | - |
22
+ | okText | `string` | `"确定"` | 否 | 确认按钮文案 | - | - |
23
+ | cancelText | `string` | `"取消"` | 否 | 取消按钮文案 | - | - |
24
+ | ok | `() => Promise<boolean | void> | boolean | void` | `undefined` | 否 | 确认时的异步处理函数,可返回 false 阻止关闭 | - | - |
25
+ | cancel | `() => void` | `undefined` | 否 | 取消时的回调逻辑 | - | - |
26
+ | container | `string | Function` | `undefined` | 否 | 指定弹窗挂载容器 | - | - |
27
+ | overlay | `boolean` | `true` | 否 | 是否显示遮罩层 | - | - |
28
+ | closable | `boolean` | `true` | 否 | 点击遮罩层是否可关闭 | - | - |
29
+ | terminate | `() => void` | `undefined` | 否 | 关闭动作统一回调 | - | - |
30
+ | escClosable | `boolean` | `true` | 否 | 是否允许 ESC 关闭 | - | - |
31
+ | hideClose | `boolean` | `false` | 否 | 是否隐藏右上角关闭按钮 | - | - |
32
+ | draggable | `boolean` | `false` | 否 | 是否允许拖拽弹窗 | - | - |
33
+ | mode | `string` | `undefined` | 否 | 弹窗展示模式 | - | - |
34
+ | hideTrigger | `boolean` | `false` | 否 | 隐藏默认 trigger,作为受控弹窗使用 | - | - |
35
+ | modelValue | `boolean | undefined` | `undefined` | 否 | 弹窗显示状态 | - | - |
36
+ | btnProps | `ButtonProps` | `undefined` | 否 | 默认 trigger 按钮属性 | - | - |
37
+ | btnText | `string` | `"打开对话框"` | 否 | 默认 trigger 按钮文案 | - | - |
38
+
39
+ ## 事件 (Events)
40
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
41
+ | --- | --- | --- | --- | --- |
42
+ | open | `@open` | 弹窗打开后触发 | `-` | `<Dialog v-model="visible" @open="handleOpen">` |
43
+ | close | `@close` | 弹窗关闭后触发,不管是什么原因导致的关闭 | `-` | `<Dialog v-model="visible" @close="handleClose">` |
44
+ | ok | `@ok` | 点击确定按钮时触发 | `-` | `<Dialog v-model="visible" @ok="handleOk">` |
45
+ | cancel | `@cancel` | 点击取消按钮时触发 | `-` | `<Dialog v-model="visible" @cancel="handleCancel">` |
46
+ | terminate | `@terminate` | 用户强行关闭弹窗时触发:点击关闭按钮、点击遮罩层、按ESC键 | `-` | `<Dialog v-model="visible" @terminate="handleTerminate">` |
47
+ | afterClose | `@after-close` | 弹窗退出动画执行完成后触发 | `-` | `<Dialog v-model="visible" @after-close="handleAfterClose">` |
48
+
49
+ ## 插槽 (Slots)
50
+ | 插槽名 | 说明 | 模板写法 | 示例 |
51
+ | --- | --- | --- | --- |
52
+ | default | 弹窗主体内容(body区域) | `默认插槽` | `<Dialog v-model="visible">
53
+ <p>弹窗内容</p>
54
+ </Dialog>` |
55
+ | header | 扩展弹窗头部 | `#header` | `<Dialog v-model="visible">
56
+ <template #header>
57
+ <h2>自定义头部</h2>
58
+ </template>
59
+ </Dialog>` |
60
+ | footer | 扩展弹窗底部按钮区域 | `#footer` | `<Dialog v-model="visible">
61
+ <template #footer>
62
+ <Button @click="visible = false">关闭</Button>
63
+ <Button type="primary" @click="handleSubmit">提交</Button>
64
+ </template>
65
+ </Dialog>` |
66
+ | content | 定义整个弹窗体,包括header、body、footer | `#content` | `<Dialog v-model="visible">
67
+ <template #content>
68
+ <!-- 完全自定义弹窗结构 -->
69
+ </template>
70
+ </Dialog>` |
71
+ | trigger | 自定义触发按钮或触发区域 | `<template #trigger>...</template>` | - |
72
+
73
+ ## 使用示例
74
+ ### 受控表单弹窗
75
+ **场景**: 在页面中以受控方式打开一个承载业务表单的弹窗。
76
+
77
+ 通过 v-model 控制弹窗显隐,并在确认时执行异步逻辑。
78
+
79
+ **使用的 API**: 属性: modelValue, title, ok, hideTrigger
80
+
81
+ ```vue
82
+ <script setup lang="ts">
83
+ import { ref } from 'vue';
84
+ import { VDialog, FormItemInput } from '@ksyun-internal/versatile';
85
+
86
+ const visible = ref(false);
87
+ const name = ref('');
88
+ const handleOk = async () => {
89
+ console.log('submit', name.value);
90
+ };
91
+ </script>
92
+
93
+ <template>
94
+ <button @click="visible = true">新建实例</button>
95
+ <VDialog v-model="visible" title="新建实例" :ok="handleOk" :hide-trigger="true">
96
+ <FormItemInput v-model="name" label="实例名称" placeholder="请输入实例名称" />
97
+ </VDialog>
98
+ </template>
99
+ ```
100
+
101
+ ### 使用 trigger 插槽触发确认弹窗
102
+ **场景**: 在操作列或详情页中用自定义按钮触发危险操作确认弹窗。
103
+
104
+ 通过 trigger 插槽自定义入口,用于危险操作前的二次确认。
105
+
106
+ **使用的 API**: 属性: title, okText, ok
107
+
108
+ ```vue
109
+ <script setup lang="ts">
110
+ import { VDialog } from '@ksyun-internal/versatile';
111
+
112
+ const handleOk = async () => {
113
+ console.log('release instance');
114
+ };
115
+ </script>
116
+
117
+ <template>
118
+ <VDialog title="释放实例" ok-text="确认释放" :ok="handleOk">
119
+ <template #trigger>
120
+ <button>释放实例</button>
121
+ </template>
122
+ <div>释放后实例数据将被删除,且不可恢复。</div>
123
+ </VDialog>
124
+ </template>
125
+ ```
126
+
127
+ ## 相关组件
128
+ Dialog, VDrawer, useDialog
129
+
@@ -0,0 +1,119 @@
1
+ # 业务抽屉 (VDrawer)
2
+
3
+ 在基础 Drawer 之上补充默认触发器、受控显隐和异步确认逻辑的业务抽屉组件,适合编辑长表单和查看侧边详情。
4
+
5
+ **关键词**: vdrawer, drawer, 业务抽屉, 侧边抽屉, 编辑抽屉, slot drawer
6
+
7
+ **使用场景**: 侧边表单编辑、详情信息展示、通过按钮触发的抽屉
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { VDrawer } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | title | `string` | `""` | 否 | 抽屉标题 | - | - |
18
+ | placement | `"left" | "right" | "top" | "bottom"` | `"right"` | 否 | 抽屉弹出方向 | - | - |
19
+ | size | `string` | `undefined` | 否 | 抽屉尺寸 | - | - |
20
+ | width | `string | number` | `undefined` | 否 | 抽屉宽度 | - | - |
21
+ | loading | `boolean` | `false` | 否 | 确认按钮加载状态 | - | - |
22
+ | disabledOk | `boolean` | `false` | 否 | 是否禁用确认按钮 | - | - |
23
+ | okText | `string` | `"确定"` | 否 | 确认按钮文案 | - | - |
24
+ | cancelText | `string` | `"取消"` | 否 | 取消按钮文案 | - | - |
25
+ | ok | `() => Promise<boolean | void> | boolean | void` | `undefined` | 否 | 确认时的异步处理函数,可返回 false 阻止关闭 | - | - |
26
+ | cancel | `() => void` | `undefined` | 否 | 取消时的回调逻辑 | - | - |
27
+ | hideClose | `boolean` | `false` | 否 | 是否隐藏右上角关闭按钮 | - | - |
28
+ | overlay | `boolean` | `true` | 否 | 是否显示遮罩层 | - | - |
29
+ | closable | `boolean` | `true` | 否 | 点击遮罩层是否可关闭 | - | - |
30
+ | escClosable | `boolean` | `true` | 否 | 是否允许 ESC 关闭 | - | - |
31
+ | draggable | `boolean` | `false` | 否 | 是否允许拖拽抽屉 | - | - |
32
+ | terminate | `() => void` | `undefined` | 否 | 关闭动作统一回调 | - | - |
33
+ | container | `string | Function` | `undefined` | 否 | 指定抽屉挂载容器 | - | - |
34
+ | mode | `string` | `undefined` | 否 | 抽屉展示模式 | - | - |
35
+ | hideTrigger | `boolean` | `false` | 否 | 隐藏默认 trigger,作为受控抽屉使用 | - | - |
36
+ | modelValue | `boolean | undefined` | `undefined` | 否 | 抽屉显示状态 | - | - |
37
+ | btnProps | `ButtonProps` | `undefined` | 否 | 默认 trigger 按钮属性 | - | - |
38
+ | btnText | `string` | `"打开抽屉"` | 否 | 默认 trigger 按钮文案 | - | - |
39
+
40
+ ## 事件 (Events)
41
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
42
+ | --- | --- | --- | --- | --- |
43
+ | open | `@open` | 抽屉打开后触发 | `-` | `<Drawer @open="handleOpen">` |
44
+ | close | `@close` | 抽屉关闭后触发,不管是什么原因导致的关闭 | `-` | `<Drawer @close="handleClose">` |
45
+ | ok | `@ok` | 点击确定按钮时触发 | `-` | `<Drawer @ok="handleOk">` |
46
+ | cancel | `@cancel` | 点击取消按钮时触发 | `-` | `<Drawer @cancel="handleCancel">` |
47
+ | terminate | `@terminate` | 用户强行关闭抽屉时触发(点击关闭按钮、遮罩层或按 ESC) | `-` | `<Drawer @terminate="handleTerminate">` |
48
+ | afterClose | `@afterClose` | 抽屉退出动画执行完成后触发 | `-` | `<Drawer @afterClose="handleAfterClose">` |
49
+
50
+ ## 插槽 (Slots)
51
+ | 插槽名 | 说明 | 模板写法 | 示例 |
52
+ | --- | --- | --- | --- |
53
+ | default | 抽屉主体内容区域 | `<VDrawer>...</VDrawer>` | - |
54
+ | header | 自定义抽屉头部 | `<template #header>...</template>` | - |
55
+ | footer | 自定义抽屉底部操作区 | `<template #footer>...</template>` | - |
56
+ | trigger | 自定义触发按钮或触发区域 | `<template #trigger>...</template>` | - |
57
+
58
+ ## 使用示例
59
+ ### 侧边编辑抽屉
60
+ **场景**: 在列表页右侧滑出编辑面板,保留用户当前上下文。
61
+
62
+ 用抽屉承载较长的编辑表单,避免打断列表上下文。
63
+
64
+ **使用的 API**: 属性: modelValue, title, ok, hideTrigger
65
+
66
+ ```vue
67
+ <script setup lang="ts">
68
+ import { ref } from 'vue';
69
+ import { VDrawer, FormItemInput, Description } from '@ksyun-internal/versatile';
70
+
71
+ const visible = ref(false);
72
+ const name = ref('web-prod-01');
73
+ const remark = ref('支付链路核心实例');
74
+ const handleOk = async () => {
75
+ console.log('save', name.value, remark.value);
76
+ };
77
+ </script>
78
+
79
+ <template>
80
+ <button @click="visible = true">编辑实例</button>
81
+ <VDrawer v-model="visible" title="编辑实例" :ok="handleOk" :hide-trigger="true">
82
+ <FormItemInput v-model="name" label="实例名称" />
83
+ <Description v-model="remark" />
84
+ </VDrawer>
85
+ </template>
86
+ ```
87
+
88
+ ### 使用 trigger 和 footer 插槽自定义抽屉
89
+ **场景**: 在详情预览场景下通过自定义触发器和底部按钮扩展抽屉交互。
90
+
91
+ 通过 trigger 和 footer 插槽自定义抽屉打开方式和底部操作区。
92
+
93
+ **使用的 API**: 属性: modelValue, title, hideTrigger
94
+
95
+ ```vue
96
+ <script setup lang="ts">
97
+ import { ref } from 'vue';
98
+ import { VDrawer } from '@ksyun-internal/versatile';
99
+
100
+ const visible = ref(false);
101
+ </script>
102
+
103
+ <template>
104
+ <VDrawer v-model="visible" title="实例详情" :hide-trigger="false">
105
+ <template #trigger>
106
+ <button>查看详情</button>
107
+ </template>
108
+ <div>这里可以放详情摘要、监控图表或操作记录。</div>
109
+ <template #footer>
110
+ <button @click="visible = false">关闭</button>
111
+ <button>导出详情</button>
112
+ </template>
113
+ </VDrawer>
114
+ </template>
115
+ ```
116
+
117
+ ## 相关组件
118
+ Drawer, VDialog
119
+
@@ -12,9 +12,9 @@ import { VirtualList } from '@king-design/vue';
12
12
  ```
13
13
 
14
14
  ## 属性 (Props)
15
- | 属性名 | 类型 | 默认值 | 必填 | 说明 | 示例 |
16
- | --- | --- | --- | --- | --- | --- |
17
- | disabled | `boolean` | `false` | 否 | 是否禁用虚拟化,禁用后会渲染所有元素 | `<VirtualList disabled></VirtualList>` |
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | disabled | `boolean` | `false` | 否 | 是否禁用虚拟化,禁用后会渲染所有元素 | - | `<VirtualList disabled></VirtualList>` |
18
18
 
19
19
  ## 子组件 (Sub-Components)
20
20
  ### VirtualListContainer
@@ -34,6 +34,7 @@ import { VirtualList } from '@king-design/vue';
34
34
  行渲染组件,包裹实际渲染的列表项
35
35
 
36
36
  ## 常见错误与正确用法 (Anti-Hallucination)
37
+ ### 容器未设置高度
37
38
  > **错误用法**: `<VirtualList> <!-- 没有高度,无法滚动 -->
38
39
  <div v-for="item in data" :key="item.value">...</div>
39
40
  </VirtualList>`
@@ -42,10 +43,12 @@ import { VirtualList } from '@king-design/vue';
42
43
  </VirtualList>`
43
44
  > **说明**: VirtualList 容器必须设置固定高度才能正常工作
44
45
 
46
+ ### 列表项缺少 key
45
47
  > **错误用法**: `<div v-for="item in data">{{ item.label }}</div>`
46
48
  > **正确写法**: `<div v-for="item in data" :key="item.value">{{ item.label }}</div>`
47
49
  > **说明**: 每个列表项必须设置唯一的 key 以确保正确渲染
48
50
 
51
+ ### 数据量较小时启用虚拟化
49
52
  > **错误用法**: `const data = [1, 2, 3]; // 只有 3 条数据
50
53
  <VirtualList>...</VirtualList>`
51
54
  > **正确写法**: `const data = [1, 2, 3];