king-design-analyzer 2.1.9 → 2.2.1

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 (327) hide show
  1. package/components/actions.json +109 -0
  2. package/components/advancedset.json +128 -0
  3. package/components/affix.json +8 -0
  4. package/components/aksk.json +172 -0
  5. package/components/anchor.json +220 -0
  6. package/components/anchorlink.json +111 -0
  7. package/components/az.json +15 -2
  8. package/components/badge.json +8 -0
  9. package/components/billtypes.json +14 -2
  10. package/components/breadcrumb.json +9 -1
  11. package/components/button.json +192 -0
  12. package/components/buttonlink.json +74 -0
  13. package/components/card.json +14 -4
  14. package/components/cardcol.json +142 -0
  15. package/components/cardcols.json +121 -0
  16. package/components/cardcontent.json +20 -3
  17. package/components/cardtabs.json +172 -0
  18. package/components/carousel.json +7 -0
  19. package/components/cascader.json +576 -368
  20. package/components/checkbox.json +51 -4
  21. package/components/cidrinput.json +140 -0
  22. package/components/code.json +8 -1
  23. package/components/collapse.json +335 -341
  24. package/components/colorpicker.json +217 -0
  25. package/components/configprovider.json +96 -0
  26. package/components/copy.json +7 -0
  27. package/components/copyhover.json +111 -0
  28. package/components/copyrow.json +125 -0
  29. package/components/datepicker.json +656 -524
  30. package/components/description.json +98 -0
  31. package/components/descriptions.json +10 -3
  32. package/components/diagram.json +295 -0
  33. package/components/dialog.json +526 -455
  34. package/components/divider.json +9 -1
  35. package/components/drawer.json +603 -558
  36. package/components/dropdown.json +464 -384
  37. package/components/duration.json +125 -0
  38. package/components/editable.json +66 -0
  39. package/components/ellipsis.json +34 -1
  40. package/components/filtertablefieldsdialog.json +128 -0
  41. package/components/flex.json +152 -0
  42. package/components/form.json +143 -3
  43. package/components/formiteminput.json +214 -0
  44. package/components/formitemspinner.json +213 -0
  45. package/components/formitemswitch.json +185 -0
  46. package/components/formitemtableconfigs.json +210 -0
  47. package/components/grid.json +7 -0
  48. package/components/header.json +165 -0
  49. package/components/icon.json +13 -1
  50. package/components/icontooltip.json +19 -1
  51. package/components/input.json +196 -8
  52. package/components/instancelist.json +194 -0
  53. package/components/instancenum.json +196 -0
  54. package/components/ipinput.json +117 -0
  55. package/components/kspstatus.json +205 -0
  56. package/components/kvcode.json +120 -0
  57. package/components/layoutcontent.json +24 -3
  58. package/components/layoutlistcontent.json +157 -0
  59. package/components/layoutpermissioncontent.json +156 -0
  60. package/components/layoutstandardlist.json +276 -0
  61. package/components/layouttabs.json +168 -0
  62. package/components/lazymount.json +87 -0
  63. package/components/lazyteleport.json +119 -0
  64. package/components/menu.json +11 -3
  65. package/components/notification.json +351 -0
  66. package/components/pagination.json +12 -0
  67. package/components/paginationplus.json +30 -3
  68. package/components/password.json +121 -0
  69. package/components/popover.json +457 -437
  70. package/components/projects.json +129 -0
  71. package/components/protable.json +99 -8
  72. package/components/queuevisualrange.json +110 -0
  73. package/components/radio.json +82 -2
  74. package/components/rate.json +200 -0
  75. package/components/region.json +14 -2
  76. package/components/scrollselect.json +140 -0
  77. package/components/search.json +221 -0
  78. package/components/searchinput.json +132 -0
  79. package/components/searchitems.json +215 -0
  80. package/components/searchselect.json +195 -0
  81. package/components/select.json +749 -666
  82. package/components/sidebar.json +198 -0
  83. package/components/skeleton.json +234 -0
  84. package/components/slider.json +12 -2
  85. package/components/spin.json +10 -2
  86. package/components/spinner.json +419 -429
  87. package/components/split.json +263 -0
  88. package/components/sshkeys.json +138 -0
  89. package/components/status.json +60 -3
  90. package/components/steps.json +7 -0
  91. package/components/switch.json +12 -3
  92. package/components/table.json +24 -2
  93. package/components/tablecolumnid.json +14 -2
  94. package/components/tabs.json +14 -2
  95. package/components/tag.json +8 -5
  96. package/components/timeline.json +215 -0
  97. package/components/timepicker.json +147 -3
  98. package/components/timerange.json +262 -0
  99. package/components/tip.json +27 -0
  100. package/components/tooltip.json +492 -395
  101. package/components/tour.json +418 -372
  102. package/components/transfer.json +79 -8
  103. package/components/tree.json +28 -5
  104. package/components/treeselect.json +612 -475
  105. package/components/upload.json +474 -473
  106. package/components/vdialog.json +309 -0
  107. package/components/vdrawer.json +335 -0
  108. package/components/virtuallist.json +7 -0
  109. package/dist/ast/index.d.mts +65 -2
  110. package/dist/ast/index.d.ts +65 -2
  111. package/dist/ast/index.js +4 -3
  112. package/dist/ast/index.mjs +2 -1
  113. package/dist/chunk-4OTQAQ6J.mjs +341 -0
  114. package/dist/{chunk-F26GUCGG.js → chunk-4WXOYU2N.js} +32 -9
  115. package/dist/chunk-6HOIRUQB.mjs +409 -0
  116. package/dist/chunk-DHLWNT53.js +364 -0
  117. package/dist/{chunk-H2ET6MMM.mjs → chunk-IPJJMPOO.mjs} +155 -66
  118. package/dist/{chunk-WYSRJVX4.js → chunk-JJ6AB4ZH.js} +2 -2
  119. package/dist/{chunk-2W6OCG2S.js → chunk-JNRGUR3O.js} +155 -67
  120. package/dist/chunk-KF5YBEM5.js +143 -0
  121. package/dist/{chunk-OJOHB64C.mjs → chunk-LRTDTFFQ.mjs} +28 -5
  122. package/dist/{chunk-DSWKLUIX.mjs → chunk-NZL6T22V.mjs} +1 -1
  123. package/dist/chunk-QC6VTSA3.mjs +117 -0
  124. package/dist/chunk-V5N65MRP.js +411 -0
  125. package/dist/full/index.d.mts +2 -0
  126. package/dist/full/index.d.ts +2 -0
  127. package/dist/full/index.js +7 -6
  128. package/dist/full/index.mjs +5 -4
  129. package/dist/index.d.mts +1 -0
  130. package/dist/index.d.ts +1 -0
  131. package/dist/index.js +14 -13
  132. package/dist/index.mjs +6 -5
  133. package/dist/metadata/index.d.mts +38 -3
  134. package/dist/metadata/index.d.ts +38 -3
  135. package/dist/metadata/index.js +26 -16
  136. package/dist/metadata/index.mjs +26 -15
  137. package/dist/resolve-BsLBxlBi.d.mts +24 -0
  138. package/dist/resolve-BsLBxlBi.d.ts +24 -0
  139. package/dist/runtime/index.d.mts +2 -0
  140. package/dist/runtime/index.d.ts +2 -0
  141. package/dist/runtime/index.js +4 -4
  142. package/dist/runtime/index.mjs +2 -2
  143. package/dist/shared/index.d.mts +10 -0
  144. package/dist/shared/index.d.ts +10 -0
  145. package/dist/shared/index.js +23 -0
  146. package/dist/shared/index.mjs +2 -0
  147. package/dist/static/index.js +5 -5
  148. package/dist/static/index.mjs +2 -2
  149. package/docs_for_llm/actions.doc.md +87 -0
  150. package/docs_for_llm/advancedset.doc.md +98 -0
  151. package/docs_for_llm/affix.doc.md +20 -7
  152. package/docs_for_llm/aksk.doc.md +111 -0
  153. package/docs_for_llm/anchor.doc.md +155 -0
  154. package/docs_for_llm/anchorlink.doc.md +75 -0
  155. package/docs_for_llm/az.doc.md +17 -11
  156. package/docs_for_llm/badge.doc.md +11 -5
  157. package/docs_for_llm/billtypes.doc.md +17 -11
  158. package/docs_for_llm/breadcrumb.doc.md +80 -4
  159. package/docs_for_llm/button.doc.md +91 -18
  160. package/docs_for_llm/buttonlink.doc.md +64 -0
  161. package/docs_for_llm/card.doc.md +58 -8
  162. package/docs_for_llm/cardcol.doc.md +78 -0
  163. package/docs_for_llm/cardcols.doc.md +84 -0
  164. package/docs_for_llm/cardcontent.doc.md +31 -10
  165. package/docs_for_llm/cardtabs.doc.md +106 -0
  166. package/docs_for_llm/carousel.doc.md +79 -7
  167. package/docs_for_llm/cascader.doc.md +106 -23
  168. package/docs_for_llm/checkbox.doc.md +25 -13
  169. package/docs_for_llm/cidrinput.doc.md +83 -0
  170. package/docs_for_llm/code.doc.md +22 -11
  171. package/docs_for_llm/collapse.doc.md +147 -14
  172. package/docs_for_llm/colorpicker.doc.md +104 -0
  173. package/docs_for_llm/configprovider.doc.md +77 -0
  174. package/docs_for_llm/copy.doc.md +15 -13
  175. package/docs_for_llm/copyhover.doc.md +59 -0
  176. package/docs_for_llm/copyrow.doc.md +80 -0
  177. package/docs_for_llm/datepicker.doc.md +66 -35
  178. package/docs_for_llm/description.doc.md +75 -0
  179. package/docs_for_llm/descriptions.doc.md +122 -10
  180. package/docs_for_llm/diagram.doc.md +343 -0
  181. package/docs_for_llm/dialog.doc.md +97 -77
  182. package/docs_for_llm/divider.doc.md +14 -7
  183. package/docs_for_llm/drawer.doc.md +114 -69
  184. package/docs_for_llm/dropdown.doc.md +290 -22
  185. package/docs_for_llm/duration.doc.md +76 -0
  186. package/docs_for_llm/editable.doc.md +36 -14
  187. package/docs_for_llm/ellipsis.doc.md +10 -5
  188. package/docs_for_llm/filtertablefieldsdialog.doc.md +99 -0
  189. package/docs_for_llm/flex.doc.md +83 -0
  190. package/docs_for_llm/form.doc.md +196 -18
  191. package/docs_for_llm/formiteminput.doc.md +128 -0
  192. package/docs_for_llm/formitemspinner.doc.md +105 -0
  193. package/docs_for_llm/formitemswitch.doc.md +113 -0
  194. package/docs_for_llm/formitemtableconfigs.doc.md +95 -0
  195. package/docs_for_llm/grid.doc.md +78 -5
  196. package/docs_for_llm/header.doc.md +114 -0
  197. package/docs_for_llm/icon.doc.md +12 -8
  198. package/docs_for_llm/icontooltip.doc.md +121 -0
  199. package/docs_for_llm/input.doc.md +199 -41
  200. package/docs_for_llm/instancelist.doc.md +113 -0
  201. package/docs_for_llm/instancenum.doc.md +95 -0
  202. package/docs_for_llm/ipinput.doc.md +77 -0
  203. package/docs_for_llm/kspstatus.doc.md +82 -0
  204. package/docs_for_llm/kvcode.doc.md +76 -0
  205. package/docs_for_llm/layoutcontent.doc.md +54 -17
  206. package/docs_for_llm/layoutlistcontent.doc.md +168 -0
  207. package/docs_for_llm/layoutpermissioncontent.doc.md +93 -0
  208. package/docs_for_llm/layoutstandardlist.doc.md +129 -0
  209. package/docs_for_llm/layouttabs.doc.md +101 -0
  210. package/docs_for_llm/lazymount.doc.md +82 -0
  211. package/docs_for_llm/lazyteleport.doc.md +85 -0
  212. package/docs_for_llm/menu.doc.md +139 -14
  213. package/docs_for_llm/message.doc.md +93 -10
  214. package/docs_for_llm/notification.doc.md +214 -0
  215. package/docs_for_llm/pagination.doc.md +30 -17
  216. package/docs_for_llm/paginationplus.doc.md +31 -10
  217. package/docs_for_llm/password.doc.md +86 -0
  218. package/docs_for_llm/popover.doc.md +24 -55
  219. package/docs_for_llm/progress.doc.md +13 -10
  220. package/docs_for_llm/projects.doc.md +91 -0
  221. package/docs_for_llm/protable.doc.md +98 -15
  222. package/docs_for_llm/queuevisualrange.doc.md +78 -0
  223. package/docs_for_llm/radio.doc.md +23 -8
  224. package/docs_for_llm/rate.doc.md +127 -0
  225. package/docs_for_llm/region.doc.md +25 -13
  226. package/docs_for_llm/scrollselect.doc.md +90 -0
  227. package/docs_for_llm/search.doc.md +120 -0
  228. package/docs_for_llm/searchinput.doc.md +111 -0
  229. package/docs_for_llm/searchitems.doc.md +116 -0
  230. package/docs_for_llm/searchselect.doc.md +126 -0
  231. package/docs_for_llm/select.doc.md +208 -49
  232. package/docs_for_llm/sidebar.doc.md +133 -0
  233. package/docs_for_llm/skeleton.doc.md +152 -0
  234. package/docs_for_llm/slider.doc.md +42 -22
  235. package/docs_for_llm/spin.doc.md +18 -6
  236. package/docs_for_llm/spinner.doc.md +28 -18
  237. package/docs_for_llm/split.doc.md +170 -0
  238. package/docs_for_llm/sshkeys.doc.md +88 -0
  239. package/docs_for_llm/status.doc.md +14 -9
  240. package/docs_for_llm/steps.doc.md +81 -7
  241. package/docs_for_llm/switch.doc.md +32 -16
  242. package/docs_for_llm/table.doc.md +317 -55
  243. package/docs_for_llm/tablecolumnid.doc.md +36 -16
  244. package/docs_for_llm/tabs.doc.md +117 -12
  245. package/docs_for_llm/tag.doc.md +167 -15
  246. package/docs_for_llm/timeline.doc.md +187 -0
  247. package/docs_for_llm/timepicker.doc.md +74 -36
  248. package/docs_for_llm/timerange.doc.md +157 -0
  249. package/docs_for_llm/tip.doc.md +50 -11
  250. package/docs_for_llm/tooltip.doc.md +99 -27
  251. package/docs_for_llm/tour.doc.md +125 -28
  252. package/docs_for_llm/transfer.doc.md +99 -33
  253. package/docs_for_llm/tree.doc.md +129 -24
  254. package/docs_for_llm/treeselect.doc.md +101 -44
  255. package/docs_for_llm/upload.doc.md +63 -32
  256. package/docs_for_llm/useCRUD.doc.md +49 -0
  257. package/docs_for_llm/useCountdown.doc.md +43 -0
  258. package/docs_for_llm/useDetail.doc.md +48 -0
  259. package/docs_for_llm/useDialog.doc.md +46 -0
  260. package/docs_for_llm/useEntity.doc.md +45 -0
  261. package/docs_for_llm/useEventListener.doc.md +44 -0
  262. package/docs_for_llm/useFalseUntilTruthy.doc.md +41 -0
  263. package/docs_for_llm/useGetCopyAuthText.doc.md +35 -0
  264. package/docs_for_llm/useGetUserPermission.doc.md +43 -0
  265. package/docs_for_llm/useGroup.doc.md +48 -0
  266. package/docs_for_llm/useIdEntities.doc.md +48 -0
  267. package/docs_for_llm/useIdEntity.doc.md +103 -0
  268. package/docs_for_llm/useInterval.doc.md +43 -0
  269. package/docs_for_llm/useLayoutStandardList.doc.md +38 -0
  270. package/docs_for_llm/useMessage.doc.md +46 -0
  271. package/docs_for_llm/useModifyCache.doc.md +37 -0
  272. package/docs_for_llm/useOpenDialog.doc.md +41 -0
  273. package/docs_for_llm/usePagination.doc.md +60 -0
  274. package/docs_for_llm/usePersist.doc.md +54 -0
  275. package/docs_for_llm/usePoll.doc.md +41 -0
  276. package/docs_for_llm/useRoutePlus.doc.md +34 -0
  277. package/docs_for_llm/useRouterPlus.doc.md +34 -0
  278. package/docs_for_llm/useSearch.doc.md +68 -0
  279. package/docs_for_llm/useShell.doc.md +43 -0
  280. package/docs_for_llm/useSkip.doc.md +41 -0
  281. package/docs_for_llm/useStorageIdEntity.doc.md +46 -0
  282. package/docs_for_llm/useStore.doc.md +34 -0
  283. package/docs_for_llm/useTable.doc.md +57 -0
  284. package/docs_for_llm/useTableGroup.doc.md +47 -0
  285. package/docs_for_llm/useTableSort.doc.md +40 -0
  286. package/docs_for_llm/useToState.doc.md +112 -0
  287. package/docs_for_llm/useUser.doc.md +38 -0
  288. package/docs_for_llm/useValidForm.doc.md +41 -0
  289. package/docs_for_llm/vdialog.doc.md +154 -0
  290. package/docs_for_llm/vdrawer.doc.md +148 -0
  291. package/docs_for_llm/virtuallist.doc.md +157 -3
  292. package/hooks/useCRUD.json +61 -0
  293. package/hooks/useCountdown.json +49 -0
  294. package/hooks/useDetail.json +67 -0
  295. package/hooks/useDialog.json +49 -0
  296. package/hooks/useEntity.json +61 -0
  297. package/hooks/useEventListener.json +61 -0
  298. package/hooks/useFalseUntilTruthy.json +43 -0
  299. package/hooks/useGetCopyAuthText.json +36 -0
  300. package/hooks/useGetUserPermission.json +55 -0
  301. package/hooks/useGroup.json +49 -0
  302. package/hooks/useIdEntities.json +61 -0
  303. package/hooks/useInterval.json +55 -0
  304. package/hooks/useLayoutStandardList.json +36 -0
  305. package/hooks/useMessage.json +73 -0
  306. package/hooks/useModifyCache.json +36 -0
  307. package/hooks/useOpenDialog.json +43 -0
  308. package/hooks/usePagination.json +49 -0
  309. package/hooks/usePersist.json +61 -0
  310. package/hooks/usePoll.json +43 -0
  311. package/hooks/useRoutePlus.json +36 -0
  312. package/hooks/useRouterPlus.json +36 -0
  313. package/hooks/useSearch.json +56 -0
  314. package/hooks/useShell.json +49 -0
  315. package/hooks/useSkip.json +43 -0
  316. package/hooks/useStorageIdEntity.json +67 -0
  317. package/hooks/useStore.json +36 -0
  318. package/hooks/useTable.json +49 -0
  319. package/hooks/useTableGroup.json +43 -0
  320. package/hooks/useTableSort.json +43 -0
  321. package/hooks/useUser.json +36 -0
  322. package/hooks/useValidForm.json +43 -0
  323. package/package.json +14 -8
  324. package/dist/chunk-D3Y6FGWA.js +0 -153
  325. package/dist/chunk-HPAUCD5I.js +0 -156
  326. package/dist/chunk-L4DS3EXI.mjs +0 -133
  327. package/dist/chunk-NZ6TLWMD.mjs +0 -151
@@ -0,0 +1,35 @@
1
+ # 复制授权文案 (useGetCopyAuthText)
2
+
3
+ 根据服务名和策略名生成复制授权相关文案,适合复制账号权限说明或 AK/SK 授权提示。
4
+
5
+ **关键词**: useGetCopyAuthText, 复制授权文案, policyName, AKSK, 权限说明, 授权提示
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useGetCopyAuthText } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 返回值
13
+ ```typescript
14
+ (serviceNames: string | Record<string, string[]>, policyName: string) => string | undefined
15
+ ```
16
+
17
+ ## 常见错误与正确用法 (Anti-Hallucination)
18
+ ### 策略名传入页面展示文案而不是实际 policyName
19
+ > **错误用法**: `getCopyAuthText('KEC', '云服务器只读');`
20
+ > **正确写法**: `getCopyAuthText('KEC', 'KecReadOnlyAccess');`
21
+ > **说明**: 第二个参数应使用真实策略标识,而不是中文标题。
22
+
23
+ ## 使用示例
24
+ ### 生成复制授权提示
25
+ 根据服务和策略名输出授权说明文案
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { useGetCopyAuthText } from '@ksyun-internal/versatile';
30
+
31
+ const getCopyAuthText = useGetCopyAuthText();
32
+ const text = getCopyAuthText('KEC', 'KecReadOnlyAccess');
33
+ </script>
34
+ ```
35
+
@@ -0,0 +1,43 @@
1
+ # 用户权限判断 (useGetUserPermission)
2
+
3
+ 根据用户列表和目标权限集合计算当前数据是否具备权限,适合列表操作按钮、批量操作和详情页权限门禁判断。
4
+
5
+ **关键词**: useGetUserPermission, 权限判断, 操作权限, 按钮禁用, auth, permission
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useGetUserPermission } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | users | `Ref<User[] | null | undefined>` | 是 | 用户或授权主体列表 |
16
+ | permissions | `string[]` | 是 | 目标权限编码列表 |
17
+ | key | `keyof User` | 否 | 权限字段所在的属性名,不传时使用默认字段 |
18
+
19
+ ## 返回值
20
+ ```typescript
21
+ ComputedRef<boolean>
22
+ ```
23
+
24
+ ## 常见错误与正确用法 (Anti-Hallucination)
25
+ ### 传入的 key 不是权限字段,导致结果始终错误
26
+ > **错误用法**: `useGetUserPermission(users, ['instance:delete'], 'name');`
27
+ > **正确写法**: `useGetUserPermission(users, ['instance:delete'], 'actions');`
28
+ > **说明**: key 应指向用户对象中真正存放权限列表的字段。
29
+
30
+ ## 使用示例
31
+ ### 控制按钮是否可操作
32
+ 根据用户权限列表生成可直接用于模板的布尔值
33
+
34
+ ```vue
35
+ <script setup lang="ts">
36
+ import { ref } from 'vue';
37
+ import { useGetUserPermission } from '@ksyun-internal/versatile';
38
+
39
+ const users = ref([{ actions: ['instance:view', 'instance:delete'] }]);
40
+ const canDelete = useGetUserPermission(users, ['instance:delete'], 'actions');
41
+ </script>
42
+ ```
43
+
@@ -0,0 +1,48 @@
1
+ # 数据分组映射 (useGroup)
2
+
3
+ 根据输入数据源和分组函数生成实体列表与分组结果,适合把接口返回的数据整理成按键聚合的展示结构。
4
+
5
+ **关键词**: useGroup, 分组, grouped, entities, 数据整理, 聚合展示
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useGroup } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | packages | `(() => P[] | undefined) | Ref<P[] | undefined>` | 是 | 原始数据源,可传 getter 或 Ref |
16
+ | forEach | `(pkg: P, fn: (key: K, data: T) => void) => void` | 是 | 遍历函数,用于从每个数据项中提取分组 key 和实体数据 |
17
+
18
+ ## 返回值
19
+ ```typescript
20
+ { entities: Ref<T[] | undefined>; grouped: Ref<Record<K, P[]> | undefined>; }
21
+ ```
22
+
23
+ ## 常见错误与正确用法 (Anti-Hallucination)
24
+ ### forEach 中没有调用回调函数,导致 grouped 为空
25
+ > **错误用法**: `useGroup(packages, (pkg) => { console.log(pkg); });`
26
+ > **正确写法**: `useGroup(packages, (pkg, push) => { push(pkg.status, pkg); });`
27
+ > **说明**: hook 依赖回调函数收集 key 和 data,没有 push 就不会产生分组结果。
28
+
29
+ ## 使用示例
30
+ ### 按状态分组实例列表
31
+ 把列表数据转换成状态分组结构,便于生成统计和分段展示
32
+
33
+ ```vue
34
+ <script setup lang="ts">
35
+ import { ref } from 'vue';
36
+ import { useGroup } from '@ksyun-internal/versatile';
37
+
38
+ const packages = ref([
39
+ { id: '1', status: 'running', name: '实例1' },
40
+ { id: '2', status: 'stopped', name: '实例2' },
41
+ ]);
42
+
43
+ const { entities, grouped } = useGroup(packages, (pkg, push) => {
44
+ push(pkg.status, pkg);
45
+ });
46
+ </script>
47
+ ```
48
+
@@ -0,0 +1,48 @@
1
+ # ID 列表映射实体列表 (useIdEntities)
2
+
3
+ 根据多个 ID 从实体列表中映射出对应的实体数组,适合多选组件、批量操作和多实体回显场景。
4
+
5
+ **关键词**: useIdEntities, 多选实体映射, ids, entity list, 批量回显, 多选
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useIdEntities } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | ids | `Ref<(string | number)[] | undefined | null>` | 是 | 选中的 ID 列表 |
16
+ | list | `Ref<Entity[] | undefined | null>` | 是 | 实体源列表 |
17
+ | key | `keyof Entity` | 是 | 用于匹配的实体主键字段 |
18
+ | emit | `(entity: Entity[] | undefined) => void` | 否 | 实体数组变化时的回调 |
19
+
20
+ ## 返回值
21
+ ```typescript
22
+ Ref<Entity[] | undefined>
23
+ ```
24
+
25
+ ## 常见错误与正确用法 (Anti-Hallucination)
26
+ ### 把单个 ID 当作 ids 传入
27
+ > **错误用法**: `useIdEntities(id, list, 'id');`
28
+ > **正确写法**: `useIdEntities(ids, list, 'id');`
29
+ > **说明**: 这个 hook 面向多值场景,首参应是 ID 数组 Ref。
30
+
31
+ ## 使用示例
32
+ ### 多选值回显实体数组
33
+ 根据选中的多个 ID 计算出完整对象列表
34
+
35
+ ```vue
36
+ <script setup lang="ts">
37
+ import { ref } from 'vue';
38
+ import { useIdEntities } from '@ksyun-internal/versatile';
39
+
40
+ const ids = ref(['ws-1', 'ws-2']);
41
+ const list = ref([
42
+ { WorkspaceId: 'ws-1', WorkspaceName: '工作空间1' },
43
+ { WorkspaceId: 'ws-2', WorkspaceName: '工作空间2' },
44
+ ]);
45
+ const entities = useIdEntities(ids, list, 'WorkspaceId');
46
+ </script>
47
+ ```
48
+
@@ -0,0 +1,103 @@
1
+ # ID 实体映射 (useIdEntity)
2
+
3
+ 根据 ID 从列表中查找对应的实体对象。当 ID 或列表变化时自动更新实体,并可选择性地触发回调。常用于 Select 等组件中需要根据选中 ID 获取完整对象信息的场景。
4
+
5
+ **关键词**: useIdEntity, id, entity, 列表查找, 实体映射, select
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useIdEntity } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | id | `Ref<string | number | undefined | null>` | 是 | 要查找的实体 ID(响应式值) |
16
+ | list | `Ref<Entity[] | undefined | null>` | 是 | 实体列表(响应式值) |
17
+ | key | `keyof Entity` | 是 | 用于匹配的实体属性名(如 'id', 'WorkspaceId' 等) |
18
+ | emit | `(entity: Entity | undefined) => void` | 否 | 实体变化时的回调函数 |
19
+ | deps | `WatchSource[]` | 否 | 额外的依赖项,当这些依赖变化时也会触发重新查找 |
20
+ | enable | `(item: Entity, index: number) => boolean` | 否 | 过滤函数,用于筛选可用的实体 |
21
+
22
+ ## 返回值
23
+ ```typescript
24
+ Ref<Entity | undefined>
25
+ ```
26
+
27
+ ## 常见错误与正确用法 (Anti-Hallucination)
28
+ ### id 参数传入非响应式值
29
+ > **错误用法**: `const entity = useIdEntity('ws-001', workspaceList, 'WorkspaceId');`
30
+ > **正确写法**: `const id = ref('ws-001');
31
+ const entity = useIdEntity(id, workspaceList, 'WorkspaceId');`
32
+ > **说明**: id 参数必须是 Ref 类型,否则无法监听变化
33
+
34
+ ### key 参数与实体属性名不匹配
35
+ > **错误用法**: `useIdEntity(id, workspaceList, 'id'); // 实体中是 WorkspaceId`
36
+ > **正确写法**: `useIdEntity(id, workspaceList, 'WorkspaceId');`
37
+ > **说明**: key 必须与实体对象中用作唯一标识的属性名完全匹配
38
+
39
+ ## 使用示例
40
+ ### 基础用法
41
+ 根据选中的 ID 获取对应的工作空间对象
42
+
43
+ ```vue
44
+ <script setup lang="ts">
45
+ import { ref } from 'vue';
46
+ import { useIdEntity } from '@ksyun-internal/versatile';
47
+
48
+ const selectedId = ref('ws-001');
49
+ const workspaceList = ref([
50
+ { WorkspaceId: 'ws-001', WorkspaceName: '工作空间1' },
51
+ { WorkspaceId: 'ws-002', WorkspaceName: '工作空间2' },
52
+ ]);
53
+
54
+ const selectedWorkspace = useIdEntity(selectedId, workspaceList, 'WorkspaceId');
55
+ // selectedWorkspace.value = { WorkspaceId: 'ws-001', WorkspaceName: '工作空间1' }
56
+ </script>
57
+ ```
58
+
59
+ ### 带回调函数
60
+ 当实体变化时触发回调
61
+
62
+ ```vue
63
+ <script setup lang="ts">
64
+ import { useToState, useIdEntity } from '@ksyun-internal/versatile';
65
+
66
+ const props = defineProps<{ modelValue?: string }>();
67
+ const emit = defineEmits<{ (e: 'update:modelValue', v?: string): void }>();
68
+
69
+ const modelValue = useToState(props, 'modelValue', emit, '');
70
+ const { workspaceList } = useWorkspaces();
71
+
72
+ useIdEntity(modelValue, workspaceList, 'WorkspaceId', (entity) => {
73
+ emit('update:modelValue', entity?.WorkspaceId);
74
+ });
75
+ </script>
76
+ ```
77
+
78
+ ### 带过滤函数
79
+ 只在启用状态的实体中查找
80
+
81
+ ```vue
82
+ <script setup lang="ts">
83
+ import { ref } from 'vue';
84
+ import { useIdEntity } from '@ksyun-internal/versatile';
85
+
86
+ const selectedId = ref('item-1');
87
+ const itemList = ref([
88
+ { id: 'item-1', name: '项目1', enabled: true },
89
+ { id: 'item-2', name: '项目2', enabled: false },
90
+ ]);
91
+
92
+ // 只在 enabled: true 的项目中查找
93
+ const entity = useIdEntity(
94
+ selectedId,
95
+ itemList,
96
+ 'id',
97
+ undefined,
98
+ undefined,
99
+ (item) => item.enabled
100
+ );
101
+ </script>
102
+ ```
103
+
@@ -0,0 +1,43 @@
1
+ # 可暂停定时器 (useInterval)
2
+
3
+ 对 setInterval 做响应式封装,提供 pause、resume 和 isActive,适合轮询、时钟和自动刷新场景。
4
+
5
+ **关键词**: useInterval, 定时器, pause, resume, 自动刷新, 轮询
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useInterval } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | cb | `() => void` | 是 | 定时执行的回调 |
16
+ | interval | `MaybeRefOrGetter<number>` | 否 | 时间间隔,默认值由上游实现决定 |
17
+ | options | `UseIntervalOptions` | 否 | 定时器配置,可设置 immediate 和 immediateCallback |
18
+
19
+ ## 返回值
20
+ ```typescript
21
+ { isActive: Readonly<ShallowRef<boolean>>; pause: () => void; resume: () => void; }
22
+ ```
23
+
24
+ ## 常见错误与正确用法 (Anti-Hallucination)
25
+ ### 暂停后修改了 interval,却以为 resume 会自动重建旧定时器逻辑
26
+ > **错误用法**: `pause(); interval.value = 1000; resume();`
27
+ > **正确写法**: `确认 interval 是响应式输入,或重新创建 useInterval。`
28
+ > **说明**: 建议明确 interval 的响应式来源,避免把它当成一次性静态参数。
29
+
30
+ ## 使用示例
31
+ ### 自动刷新列表
32
+ 以固定间隔刷新列表数据,并可手动暂停
33
+
34
+ ```vue
35
+ <script setup lang="ts">
36
+ import { useInterval } from '@ksyun-internal/versatile';
37
+
38
+ const { pause, resume, isActive } = useInterval(() => {
39
+ console.log('refresh');
40
+ }, 5000, { immediate: true });
41
+ </script>
42
+ ```
43
+
@@ -0,0 +1,38 @@
1
+ # 标准列表页组合状态 (useLayoutStandardList)
2
+
3
+ 为 LayoutStandardList 组合分页、搜索、分组、排序、列设置和批量操作状态,适合标准列表页快速搭建。
4
+
5
+ **关键词**: useLayoutStandardList, LayoutStandardList, 标准列表页, 分页 搜索 排序, 批量操作, 表格组合状态
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useLayoutStandardList } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 返回值
13
+ ```typescript
14
+ { layoutStandardListRef: Ref<any>; page: Ref<number>; limit: Ref<number>; searchValue: Ref<string>; searchItems: Ref<Record<string, any> | undefined>; group: Ref<Record<string, any>>; sort: Ref<TableSortValue>; checkedKeys: Ref<string[]>; tableRef: Ref<Table | undefined>; refetch: any; loading: any; isShowDialog: Ref<boolean>; showFilterTableFieldsDialog: Function; ... }
15
+ ```
16
+
17
+ ## 常见错误与正确用法 (Anti-Hallucination)
18
+ ### 在 LayoutStandardList 外又重复手写 useSearch/usePagination/useTableSort,导致状态来源分裂
19
+ > **错误用法**: `const search = useSearch(); const pagination = usePagination(); const state = useLayoutStandardList();`
20
+ > **正确写法**: `const state = useLayoutStandardList();`
21
+ > **说明**: 如果页面主体就是 LayoutStandardList,优先复用这个组合 hook。
22
+
23
+ ## 使用示例
24
+ ### 标准列表页容器
25
+ 在 LayoutStandardList 外层持有组合状态和实例引用
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { LayoutStandardList, useLayoutStandardList } from '@ksyun-internal/versatile';
30
+
31
+ const { layoutStandardListRef, page, limit, searchItems, checkedKeys } = useLayoutStandardList();
32
+ </script>
33
+
34
+ <template>
35
+ <LayoutStandardList ref="layoutStandardListRef" :use-list="() => ({ loading: false, dataSource: [], total: 0 })" />
36
+ </template>
37
+ ```
38
+
@@ -0,0 +1,46 @@
1
+ # 变更消息反馈 (useMessage)
2
+
3
+ 为 Apollo mutation 封装统一的成功/失败消息处理逻辑,适合删除、编辑、创建等需要标准化提示文案的请求场景。
4
+
5
+ **关键词**: useMessage, mutation 提示, apollo, 成功失败消息, toast, 反馈
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useMessage } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | onError | `UseMutationReturn<TResult, TVariables>['onError']` | 是 | mutation 返回的错误监听函数 |
16
+ | onDone | `UseMutationReturn<TResult, TVariables>['onDone']` | 否 | mutation 返回的完成监听函数 |
17
+ | isSuccess | `(res: FetchResult<TResult>) => boolean` | 否 | 自定义成功判定逻辑 |
18
+ | action | `string | (() => string)` | 否 | 操作名称,用于生成成功/失败提示文案 |
19
+ | successCallback | `(res: FetchResult<TResult>) => any` | 否 | 成功后的额外回调 |
20
+ | failedCallback | `(e: Error) => any` | 否 | 失败后的额外回调 |
21
+
22
+ ## 返回值
23
+ ```typescript
24
+ void
25
+ ```
26
+
27
+ ## 常见错误与正确用法 (Anti-Hallucination)
28
+ ### 接口返回结构不是标准成功态,但没有传 isSuccess,自定义失败被当成成功
29
+ > **错误用法**: `useMessage(onError, onDone, undefined, '删除');`
30
+ > **正确写法**: `useMessage(onError, onDone, (res) => res.data?.delete?.code === 200, '删除');`
31
+ > **说明**: 如果后端不是默认成功结构,建议显式提供 isSuccess。
32
+
33
+ ## 使用示例
34
+ ### 统一处理 mutation 提示
35
+ 把创建、删除等 mutation 的消息提示收口到 hook
36
+
37
+ ```vue
38
+ <script setup lang="ts">
39
+ import { useMutation } from '@vue/apollo-composable';
40
+ import { useMessage } from '@ksyun-internal/versatile';
41
+
42
+ const { onError, onDone } = useMutation(CREATE_INSTANCE);
43
+ useMessage(onError, onDone, undefined, '创建实例');
44
+ </script>
45
+ ```
46
+
@@ -0,0 +1,37 @@
1
+ # Apollo 缓存修改 (useModifyCache)
2
+
3
+ 返回一个可复用的 Apollo cache.modify 封装函数,适合在 mutation 后局部更新缓存而不重新发请求。
4
+
5
+ **关键词**: useModifyCache, apollo cache, cache.modify, mutation, 局部更新缓存, graphql
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useModifyCache } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 返回值
13
+ ```typescript
14
+ (identify: StoreObject | Reference, fields: Cache.ModifyOptions['fields']) => void
15
+ ```
16
+
17
+ ## 常见错误与正确用法 (Anti-Hallucination)
18
+ ### identify 对象缺少 Apollo 可识别的标识字段
19
+ > **错误用法**: `modifyCache({ name: 'instance-1' }, { status: () => 'running' });`
20
+ > **正确写法**: `modifyCache({ __typename: 'Instance', id: 'ins-1' }, { status: () => 'running' });`
21
+ > **说明**: identify 需要能让 Apollo 唯一定位缓存实体。
22
+
23
+ ## 使用示例
24
+ ### 局部更新 Apollo 缓存
25
+ 在删除或编辑成功后直接修改缓存字段
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { useModifyCache } from '@ksyun-internal/versatile';
30
+
31
+ const modifyCache = useModifyCache();
32
+ modifyCache({ __typename: 'Instance', id: 'ins-1' }, {
33
+ name: () => 'new-name',
34
+ });
35
+ </script>
36
+ ```
37
+
@@ -0,0 +1,41 @@
1
+ # 表格操作弹窗 (useOpenDialog)
2
+
3
+ 针对表格单行操作和批量操作封装弹窗打开逻辑,统一维护当前操作项和批量操作项集合。
4
+
5
+ **关键词**: useOpenDialog, 批量操作, 表格操作, dialog, 单行操作, tableRef
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useOpenDialog } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | tableRef | `Ref<Table | undefined>` | 否 | 表格实例引用,批量操作时可从表格中读取选中项 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { isShowDialog: Ref<boolean>; dialogRef: Ref<any>; opCols: Ref<T[] | undefined>; opCol: Ref<T | undefined>; show: Function; hide: Function; handleClickOpBtn: Function; handleClickBatchOpBtn: Function; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 批量操作场景未传入 tableRef,导致无法读取选中项
24
+ > **错误用法**: `const dialog = useOpenDialog();`
25
+ > **正确写法**: `const dialog = useOpenDialog(tableRef);`
26
+ > **说明**: 如果需要 handleClickBatchOpBtn 读取表格选中项,应传入 tableRef。
27
+
28
+ ## 使用示例
29
+ ### 表格操作弹窗
30
+ 点击单行操作按钮时打开弹窗并记录当前行数据
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { ref } from 'vue';
35
+ import { useOpenDialog } from '@ksyun-internal/versatile';
36
+
37
+ const tableRef = ref();
38
+ const { isShowDialog, opCol, handleClickOpBtn } = useOpenDialog(tableRef);
39
+ </script>
40
+ ```
41
+
@@ -0,0 +1,60 @@
1
+ # 分页状态管理 (usePagination)
2
+
3
+ 管理列表页常用的 page、limit、limits 以及分页变更回调,适合和 ProTable、PaginationPlus、Search 组合使用。
4
+
5
+ **关键词**: usePagination, 分页, page, limit, PaginationPlus, 列表页
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { usePagination } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | options | `{ page?: number; limit?: number; limits?: number[]; callback?: (v: PaginationChangeData) => void }` | 否 | 分页初始化配置,可预设页码、每页条数、可选 limits 及翻页后的回调 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ { page: Ref<number>; limit: Ref<number>; limits: Ref<number[]>; pageChange: (pageParams: PaginationChangeData) => void; }
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 只绑定 page,没有同步维护 limit
24
+ > **错误用法**: `const { page } = usePagination();`
25
+ > **正确写法**: `const { page, limit } = usePagination();`
26
+ > **说明**: 如果页面支持切换每页条数,应同时使用 hook 返回的 limit。
27
+
28
+ ## 使用示例
29
+ ### 基础分页用法
30
+ 通过 hook 统一管理列表页码和每页条数
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { PaginationPlus, usePagination } from '@ksyun-internal/versatile';
35
+
36
+ const { page, limit, pageChange } = usePagination({
37
+ page: 1,
38
+ limit: 20,
39
+ });
40
+ </script>
41
+
42
+ <template>
43
+ <PaginationPlus v-model="page" v-model:limit="limit" :total="200" @change="pageChange" />
44
+ </template>
45
+ ```
46
+
47
+ ### 带回调的分页
48
+ 在分页变化后触发数据刷新或埋点逻辑
49
+
50
+ ```vue
51
+ <script setup lang="ts">
52
+ import { usePagination } from '@ksyun-internal/versatile';
53
+
54
+ const fetchList = () => console.log('reload');
55
+ const { page, limit, pageChange } = usePagination({
56
+ callback: () => fetchList(),
57
+ });
58
+ </script>
59
+ ```
60
+
@@ -0,0 +1,54 @@
1
+ # 本地持久化 (usePersist)
2
+
3
+ 将响应式数据持久化到 localStorage 或 sessionStorage,适合保存列表筛选、用户偏好和表格配置。
4
+
5
+ **关键词**: usePersist, localStorage, sessionStorage, 持久化, 列表偏好, 缓存状态
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { usePersist } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | key | `string` | 是 | 存储键名 |
16
+ | defaultValue | `T` | 是 | 初始化默认值 |
17
+ | options | `PersistOptions<T>` | 否 | 持久化配置,可切换 storage、自定义序列化和 watch 行为 |
18
+
19
+ ## 返回值
20
+ ```typescript
21
+ Ref<T>
22
+ ```
23
+
24
+ ## 常见错误与正确用法 (Anti-Hallucination)
25
+ ### 使用会变化的 key,导致同一份状态被重复写入
26
+ > **错误用法**: `usePersist(`table-${Date.now()}`, []);`
27
+ > **正确写法**: `usePersist('instance-table-fields', []);`
28
+ > **说明**: key 应保持稳定,否则无法复用持久化结果。
29
+
30
+ ## 使用示例
31
+ ### 持久化表格配置
32
+ 保存用户的列显隐或筛选配置
33
+
34
+ ```vue
35
+ <script setup lang="ts">
36
+ import { usePersist } from '@ksyun-internal/versatile';
37
+
38
+ const tableFields = usePersist('table-fields', ['name', 'status']);
39
+ </script>
40
+ ```
41
+
42
+ ### 使用 sessionStorage
43
+ 仅在当前会话内保留搜索状态
44
+
45
+ ```vue
46
+ <script setup lang="ts">
47
+ import { usePersist } from '@ksyun-internal/versatile';
48
+
49
+ const searchState = usePersist('instance-search', { key: 'name', value: '' }, {
50
+ storage: sessionStorage,
51
+ });
52
+ </script>
53
+ ```
54
+
@@ -0,0 +1,41 @@
1
+ # 查询轮询 (usePoll)
2
+
3
+ 包装 Apollo 查询结果并启用轮询场景,适合在列表页、详情页中持续刷新接口数据。
4
+
5
+ **关键词**: usePoll, 轮询, apollo, useQuery, 自动刷新, 列表轮询
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { usePoll } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 参数 (Params)
13
+ | 参数名 | 类型 | 必填 | 说明 |
14
+ | --- | --- | --- | --- |
15
+ | result | `UseQueryReturn<any, any>` | 是 | Apollo useQuery 返回的查询对象 |
16
+
17
+ ## 返回值
18
+ ```typescript
19
+ UseQueryReturn<any, any>
20
+ ```
21
+
22
+ ## 常见错误与正确用法 (Anti-Hallucination)
23
+ ### 传入普通 Promise 或自定义对象而不是 Apollo 查询返回值
24
+ > **错误用法**: `const result = usePoll(fetchList());`
25
+ > **正确写法**: `const result = usePoll(useQuery(GET_LIST));`
26
+ > **说明**: usePoll 依赖 Apollo 的 UseQueryReturn 结构。
27
+
28
+ ## 使用示例
29
+ ### 轮询查询结果
30
+ 对 useQuery 返回值启用轮询式刷新
31
+
32
+ ```vue
33
+ <script setup lang="ts">
34
+ import { useQuery } from '@vue/apollo-composable';
35
+ import { usePoll } from '@ksyun-internal/versatile';
36
+
37
+ const queryResult = useQuery(GET_INSTANCE_LIST);
38
+ const pollResult = usePoll(queryResult);
39
+ </script>
40
+ ```
41
+
@@ -0,0 +1,34 @@
1
+ # 增强路由读取 (useRoutePlus)
2
+
3
+ 对 vue-router 的 route 做包装,直接返回 params、query 及其 refs,便于在组合式函数中按字段响应式使用。
4
+
5
+ **关键词**: useRoutePlus, route params, query refs, vue-router, 详情页参数, 路由读取
6
+
7
+ ## 导入语句
8
+ ```typescript
9
+ import { useRoutePlus } from '@ksyun-internal/versatile';
10
+ ```
11
+
12
+ ## 返回值
13
+ ```typescript
14
+ { $route: RouteLocationNormalizedLoadedGeneric; params: Record<string, string>; paramRefs: ToRefs<Record<string, string>>; query: LocationQuery; queryRefs: ToRefs<LocationQuery>; }
15
+ ```
16
+
17
+ ## 常见错误与正确用法 (Anti-Hallucination)
18
+ ### 直接修改 paramRefs/queryRefs,期望同步改写路由地址
19
+ > **错误用法**: `paramRefs.id.value = '2';`
20
+ > **正确写法**: `如需跳转,请配合 useRouterPlus 或 router.push。`
21
+ > **说明**: 这个 hook 主要用于读取路由状态,不负责写回 URL。
22
+
23
+ ## 使用示例
24
+ ### 读取详情页路由参数
25
+ 把详情页 id 和 query 参数拆成可直接使用的 refs
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { useRoutePlus } from '@ksyun-internal/versatile';
30
+
31
+ const { params, paramRefs, queryRefs } = useRoutePlus();
32
+ </script>
33
+ ```
34
+