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,126 @@
1
+ # 搜索下拉框 (SearchSelect)
2
+
3
+ 面向搜索维度或搜索值选择的业务下拉组件,适合在搜索框左侧选择字段,也适合承载小规模筛选选项。
4
+
5
+ **关键词**: search select, search field select, filter select, 下拉搜索, 搜索下拉框, 检索字段选择, 筛选字段, 条件下拉
6
+
7
+ **使用场景**: 搜索类型选择、业务下拉筛选、组合搜索左侧字段切换、小规模筛选项选择
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { SearchSelect } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | multiple | `boolean` | `false` | 否 | 是否支持多选 | `inherited:Select` | `<Select v-model="selectedList" multiple>` |
18
+ | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | `inherited:Select` | `<Select v-model="selected" filterable>` |
19
+ | loading | `boolean` | `false` | 否 | 数据加载状态 | `inherited:Select` | `<Select v-model="selected" :loading="isLoading">` |
20
+ | disabled | `boolean` | `false` | 否 | 是否禁用 | `inherited:Select` | `<Select disabled>` |
21
+ | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | `inherited:Select` | `<Select name="city">` |
22
+ | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | `inherited:Select` | `<Select size="small">` |
23
+ | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | `inherited:Select` | `<Select hideIcon>` |
24
+ | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | `inherited:Select` | `<Select v-model="selected" clearable>` |
25
+ | fluid | `boolean` | `false` | 否 | 是否宽度 100% | `inherited:Select` | `<Select fluid>` |
26
+ | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | `inherited:Select` | `<Select inline>` |
27
+ | placeholder | `string` | `"请选择"` | 否 | 占位文案 | `inherited:Select` | `<Select placeholder="请选择城市">` |
28
+ | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | `inherited:Select` | `<Select :container="() => document.body">` |
29
+ | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | `inherited:Select` | `<Select :width="200">` |
30
+ | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | `inherited:Select` | `<Select filterable :filter="(kw, props) => props.label.includes(kw)">` |
31
+ | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | `inherited:Select` | `<Select searchable>` |
32
+ | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | `inherited:Select` | `<Select filterable creatable>` |
33
+ | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | `inherited:Select` | `<Select :labelMap="new Map([['custom', '自定义选项']])">` |
34
+ | card | `boolean` | `false` | 否 | 是否展示 card 模式 | `inherited:Select` | `<Select card>` |
35
+ | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | `inherited:Select` | `<Select autoDisableArrow>` |
36
+ | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | `inherited:Select` | `<Select filterable :keepKeywords="false">` |
37
+ | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | `inherited:Select` | `<Select :show="isMenuVisible">` |
38
+ | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | `inherited:Select` | `<Select position="top">` |
39
+ | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | `inherited:Select` | `<Select flat>` |
40
+ | nowrap | `boolean` | `false` | 否 | 选中值区域是否不换行展示,适合单行紧凑布局 | `inherited:Select` | `<Select nowrap>` |
41
+ | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | `inherited:Select` | `<Select multiple draggable>` |
42
+ | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | `inherited:Select` | `<Select virtual>` |
43
+ | label | `string` | `undefined` | 否 | 下拉框前置标题或说明文案 | - | - |
44
+ | helper | `string` | `undefined` | 否 | 辅助提示文案 | - | - |
45
+ | modelValue | `string` | `""` | 否 | 当前选中的值 | - | - |
46
+ | searches | `SearchType[] | Record<string, SearchType>` | `[]` | 否 | 搜索选项列表 | - | - |
47
+ | searchKeyName | `string` | `"key"` | 否 | 搜索项中 value 字段名 | - | - |
48
+ | searchLabelName | `string` | `"label"` | 否 | 搜索项中 label 字段名 | - | - |
49
+ | searchGroups | `SearchGroupItem[]` | `undefined` | 否 | 搜索项分组配置 | - | - |
50
+ | showValue | `boolean` | `false` | 否 | 选项展示时是否同时显示 value | - | - |
51
+
52
+ ## 事件 (Events)
53
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
54
+ | --- | --- | --- | --- | --- |
55
+ | change:value | `@change:value` | 下拉选中值变化时触发,通常用于联动输入框占位或直接发起查询。 | `value?: string` | - |
56
+
57
+ ### 事件参数说明
58
+ **change:value**
59
+
60
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
61
+ | --- | --- | --- | --- | --- |
62
+ | value | `string` | 否 | - | 当前选中的搜索项 key。 |
63
+
64
+ ## 使用示例
65
+ ### 选择搜索维度
66
+ **场景**: 在列表搜索区切换当前按哪个字段检索。
67
+
68
+ 在组合搜索中用下拉框切换当前搜索字段。
69
+
70
+ **使用的 API**: 属性: modelValue, label, searches | 事件: change:value
71
+
72
+ ```vue
73
+ <script setup lang="ts">
74
+ import { ref } from 'vue';
75
+ import { SearchSelect } from '@ksyun-internal/versatile';
76
+
77
+ const searchKey = ref('name');
78
+ const searches = [
79
+ { key: 'name', label: '实例名称' },
80
+ { key: 'id', label: '实例 ID' },
81
+ { key: 'ip', label: '内网 IP' },
82
+ ];
83
+ </script>
84
+
85
+ <template>
86
+ <SearchSelect
87
+ v-model="searchKey"
88
+ label="搜索字段"
89
+ :searches="searches"
90
+ />
91
+ </template>
92
+ ```
93
+
94
+ ### 同时展示标签和值
95
+ **场景**: 在字段名称可能重复或歧义较大时同时展示 key 和 label。
96
+
97
+ 在选项较多时同时展示 value,方便用户准确识别字段。
98
+
99
+ **使用的 API**: 属性: modelValue, searches, helper, showValue | 事件: change:value
100
+
101
+ ```vue
102
+ <script setup lang="ts">
103
+ import { ref } from 'vue';
104
+ import { SearchSelect } from '@ksyun-internal/versatile';
105
+
106
+ const searchKey = ref('instanceId');
107
+ const searches = [
108
+ { key: 'instanceId', label: '实例 ID' },
109
+ { key: 'privateIp', label: '内网 IP' },
110
+ { key: 'projectId', label: '项目 ID' },
111
+ ];
112
+ </script>
113
+
114
+ <template>
115
+ <SearchSelect
116
+ v-model="searchKey"
117
+ :searches="searches"
118
+ helper="请选择检索字段"
119
+ :show-value="true"
120
+ />
121
+ </template>
122
+ ```
123
+
124
+ ## 相关组件
125
+ Search, Select
126
+
@@ -12,94 +12,251 @@ import { Select, Option, OptionGroup } from '@king-design/vue';
12
12
  ```
13
13
 
14
14
  ## 属性 (Props)
15
- | 属性名 | 类型 | 默认值 | 必填 | 说明 | 示例 |
16
- | --- | --- | --- | --- | --- | --- |
17
- | value | `any` | `""` | 否 | 当前选择的元素,可用 v-model 双向绑定 | `<Select v-model="selected"></Select>` |
18
- | multiple | `boolean` | `false` | 否 | 是否支持多选 | `<Select v-model="selectedList" multiple></Select>` |
19
- | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | `<Select v-model="selected" filterable></Select>` |
20
- | loading | `boolean` | `false` | 否 | 数据加载状态 | `<Select v-model="selected" :loading="isLoading"></Select>` |
21
- | disabled | `boolean` | `false` | 否 | 是否禁用 | `<Select disabled></Select>` |
22
- | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | `<Select name="city"></Select>` |
23
- | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | `<Select size="small"></Select>` |
24
- | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | `<Select hideIcon></Select>` |
25
- | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | `<Select v-model="selected" clearable></Select>` |
26
- | fluid | `boolean` | `false` | 否 | 是否宽度 100% | `<Select fluid></Select>` |
27
- | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | `<Select inline></Select>` |
28
- | placeholder | `string` | `"请选择"` | 否 | 占位文案 | `<Select placeholder="请选择城市"></Select>` |
29
- | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | `<Select :container="() => document.body"></Select>` |
30
- | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | `<Select :width="200"></Select>` |
31
- | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | `<Select filterable :filter="(kw, props) => props.label.includes(kw)"></Select>` |
32
- | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | `<Select searchable></Select>` |
33
- | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | `<Select filterable creatable></Select>` |
34
- | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | `<Select :labelMap="new Map([['custom', '自定义选项']])"></Select>` |
35
- | card | `boolean` | `false` | 否 | 是否展示 card 模式 | `<Select card></Select>` |
36
- | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | `<Select autoDisableArrow></Select>` |
37
- | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | `<Select filterable :keepKeywords="false"></Select>` |
38
- | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | `<Select :show="isMenuVisible"></Select>` |
39
- | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | `<Select position="top"></Select>` |
40
- | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | `<Select flat></Select>` |
41
- | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | `<Select multiple draggable></Select>` |
42
- | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | `<Select virtual></Select>` |
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | value | `any` | `""` | 否 | 当前选择的元素,可用 v-model 双向绑定 | - | `<Select v-model="selected">` |
18
+ | multiple | `boolean` | `false` | 否 | 是否支持多选 | - | `<Select v-model="selectedList" multiple>` |
19
+ | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | - | `<Select v-model="selected" filterable>` |
20
+ | loading | `boolean` | `false` | 否 | 数据加载状态 | - | `<Select v-model="selected" :loading="isLoading">` |
21
+ | disabled | `boolean` | `false` | 否 | 是否禁用 | - | `<Select disabled>` |
22
+ | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | - | `<Select name="city">` |
23
+ | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | - | `<Select size="small">` |
24
+ | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | - | `<Select hideIcon>` |
25
+ | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | - | `<Select v-model="selected" clearable>` |
26
+ | fluid | `boolean` | `false` | 否 | 是否宽度 100% | - | `<Select fluid>` |
27
+ | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | - | `<Select inline>` |
28
+ | placeholder | `string` | `"请选择"` | 否 | 占位文案 | - | `<Select placeholder="请选择城市">` |
29
+ | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | - | `<Select :container="() => document.body">` |
30
+ | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | - | `<Select :width="200">` |
31
+ | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | - | `<Select filterable :filter="(kw, props) => props.label.includes(kw)">` |
32
+ | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | - | `<Select searchable>` |
33
+ | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | - | `<Select filterable creatable>` |
34
+ | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | - | `<Select :labelMap="new Map([['custom', '自定义选项']])">` |
35
+ | card | `boolean` | `false` | 否 | 是否展示 card 模式 | - | `<Select card>` |
36
+ | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | - | `<Select autoDisableArrow>` |
37
+ | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | - | `<Select filterable :keepKeywords="false">` |
38
+ | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | - | `<Select :show="isMenuVisible">` |
39
+ | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | - | `<Select position="top">` |
40
+ | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | - | `<Select flat>` |
41
+ | nowrap | `boolean` | `false` | 否 | 选中值区域是否不换行展示,适合单行紧凑布局 | - | `<Select nowrap>` |
42
+ | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | - | `<Select multiple draggable>` |
43
+ | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | - | `<Select virtual>` |
43
44
 
44
45
  ## 事件 (Events)
45
46
  | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
46
47
  | --- | --- | --- | --- | --- |
47
- | show | `@show` | 菜单弹出时触发 | `-` | `<Select @show="handleShow"></Select>` |
48
- | hide | `@hide` | 菜单隐藏时触发 | `-` | `<Select @hide="handleHide"></Select>` |
48
+ | show | `@show` | 菜单弹出时触发 | `-` | `<Select @show="handleShow">` |
49
+ | hide | `@hide` | 菜单隐藏时触发 | `-` | `<Select @hide="handleHide">` |
50
+
51
+ ## 插槽 (Slots)
52
+ | 插槽名 | 说明 | 模板写法 | 示例 |
53
+ | --- | --- | --- | --- |
54
+ | value | 自定义单选模式下的已选值展示内容 | `#value="[value, label]"` | `<Select v-model="selected">
55
+ <template #value="[value, label]">
56
+ <span>{{ label }} ({{ value }})</span>
57
+ </template>
58
+ </Select>` |
59
+ | values | 自定义多选模式下的已选值展示内容 | `#values="[values, labels]"` | `<Select v-model="selectedList" multiple>
60
+ <template #values="[values, labels]">
61
+ <span>已选 {{ labels.length }} 项</span>
62
+ </template>
63
+ </Select>` |
64
+ | prefix | 扩展选择框前缀内容 | `#prefix` | `<Select>
65
+ <template #prefix>
66
+ <span class="k-icon-search"></span>
67
+ </template>
68
+ </Select>` |
69
+ | suffix | 扩展选择框后缀内容 | `#suffix` | `<Select>
70
+ <template #suffix>
71
+ <span>自定义</span>
72
+ </template>
73
+ </Select>` |
74
+ | menu | 自定义整个下拉菜单区域 | `#menu` | `<Select>
75
+ <template #menu>
76
+ <div>自定义菜单内容</div>
77
+ </template>
78
+ </Select>` |
79
+
80
+ ### 插槽参数说明
81
+ **value**
82
+
83
+ - 参数结构: #value="[value, label]"
84
+ - 参数列表: `value: T`、`label: string`
85
+
86
+ **values**
87
+
88
+ - 参数结构: #values="[values, labels]"
89
+ - 参数列表: `values: T[]`、`labels: string[]`
90
+
91
+ **prefix**
92
+
93
+ - 参数结构: 无参数
94
+
95
+ **suffix**
96
+
97
+ - 参数结构: 无参数
98
+
99
+ **menu**
100
+
101
+ - 参数结构: 无参数
102
+
103
+ ## 方法 (Methods)
104
+ | 方法名 | 说明 | 参数 | 返回值 |
105
+ | --- | --- | --- | --- |
106
+ | show | 主动展开选择器下拉面板。 | `-` | `void` |
107
+ | hide | 主动关闭选择器下拉面板。 | `-` | `void` |
108
+ | position | 重新计算当前选择器下拉面板的位置。 | `-` | `void` |
109
+
110
+ ### 方法调用示例
111
+ **show**
49
112
 
50
- ### 事件处理函数示例
51
- **show**:
52
113
  ```typescript
53
- const handleShow = () => {
54
- console.log('下拉菜单已展开');
55
- };
114
+ selectRef.value?.show();
56
115
  ```
57
116
 
58
- **hide**:
117
+ **hide**
118
+
59
119
  ```typescript
60
- const handleHide = () => {
61
- console.log('下拉菜单已关闭');
62
- };
120
+ selectRef.value?.hide();
63
121
  ```
64
122
 
65
- ## 插槽 (Slots)
66
- | 插槽名 | 说明 | 模板写法 | 示例 |
67
- | --- | --- | --- | --- |
68
- | value | 自定义选择结果的展示 | `undefined` | - |
69
- | values | 自定义多选的选择结果的展示 | `undefined` | - |
70
- | prefix | 自定义输入框前面展示的内容 | `undefined` | - |
71
- | suffix | 自定义输入框后面展示的内容 | `undefined` | - |
72
- | menu | 自定义整个菜单的内容 | `undefined` | - |
123
+ **position**
124
+
125
+ ```typescript
126
+ selectRef.value?.position();
127
+ ```
73
128
 
74
129
  ## 子组件 (Sub-Components)
75
130
  ### Option
76
131
  选项组件,用于定义下拉选项
77
132
 
133
+ #### 属性 (Props)
78
134
  | 属性名 | 类型 | 说明 | 示例 |
79
135
  | --- | --- | --- | --- |
80
136
  | value | `any` | 选中的值 | `<Option value="apple" label="苹果" />` |
81
137
  | label | `string` | 展示文案,同时也作为筛选的内容。不存在时使用 children 的文本 | `<Option value="apple" label="苹果" />` |
82
138
  | disabled | `boolean` | 是否禁用该项选择 | `<Option value="apple" label="苹果" disabled />` |
83
139
 
140
+ #### 组合示例
141
+ ##### 禁用选项
142
+ **场景**: 禁用下拉框中的某些选项
143
+
144
+ 禁用特定的选项
145
+
146
+ **命中的子组件 API**: 属性: value, label, disabled
147
+
148
+ ```vue
149
+ <script setup lang="ts">
150
+ import { ref } from 'vue';
151
+ import { Select, Option } from '@king-design/vue';
152
+
153
+ const selected = ref('');
154
+ </script>
155
+ <template>
156
+ <Select v-model="selected">
157
+ <Option value="apple" label="苹果" />
158
+ <Option value="orange" label="橙子" disabled />
159
+ <Option value="banana" label="香蕉" />
160
+ </Select>
161
+ </template>
162
+ ```
163
+
164
+ ##### 多选
165
+ **场景**: 创建一个支持多选的下拉框
166
+
167
+ 支持选择多个选项
168
+
169
+ **命中的子组件 API**: 属性: value, label
170
+
171
+ ```vue
172
+ <script setup lang="ts">
173
+ import { ref } from 'vue';
174
+ import { Select, Option } from '@king-design/vue';
175
+
176
+ const selected = ref<string[]>([]);
177
+ </script>
178
+ <template>
179
+ <Select v-model="selected" multiple placeholder="请选择多项">
180
+ <Option value="apple" label="苹果" />
181
+ <Option value="orange" label="橙子" />
182
+ <Option value="banana" label="香蕉" />
183
+ <Option value="grape" label="葡萄" />
184
+ </Select>
185
+ </template>
186
+ ```
187
+
188
+ ##### 可搜索
189
+ **场景**: 创建一个可以通过关键字搜索的下拉框
190
+
191
+ 可以通过输入关键字筛选选项
192
+
193
+ **命中的子组件 API**: 属性: value, label
194
+
195
+ ```vue
196
+ <script setup lang="ts">
197
+ import { ref } from 'vue';
198
+ import { Select, Option } from '@king-design/vue';
199
+
200
+ const selected = ref('');
201
+ </script>
202
+ <template>
203
+ <Select v-model="selected" filterable placeholder="输入关键字搜索">
204
+ <Option value="beijing" label="北京" />
205
+ <Option value="shanghai" label="上海" />
206
+ <Option value="guangzhou" label="广州" />
207
+ <Option value="shenzhen" label="深圳" />
208
+ </Select>
209
+ </template>
210
+ ```
211
+
84
212
  ### OptionGroup
85
213
  选项分组组件,用于对选项进行分组展示
86
214
 
215
+ #### 属性 (Props)
87
216
  | 属性名 | 类型 | 说明 | 示例 |
88
217
  | --- | --- | --- | --- |
89
218
  | label | `string | number | VNode` | 分组标签名 | `<OptionGroup label="水果">
90
219
  <Option value="apple" label="苹果" />
91
220
  </OptionGroup>` |
92
221
 
93
- **插槽**:
94
- - `undefined`: 定义复杂的分组标签名
222
+ #### 组合示例
223
+ ##### 分组选项
224
+ **场景**: 创建带有分组的下拉选择框
225
+
226
+ 使用 OptionGroup 对选项进行分组
227
+
228
+ **命中的子组件 API**: 属性: label
229
+
230
+ ```vue
231
+ <script setup lang="ts">
232
+ import { ref } from 'vue';
233
+ import { Select, Option, OptionGroup } from '@king-design/vue';
234
+
235
+ const selected = ref('');
236
+ </script>
237
+ <template>
238
+ <Select v-model="selected" placeholder="请选择">
239
+ <OptionGroup label="水果">
240
+ <Option value="apple" label="苹果" />
241
+ <Option value="orange" label="橙子" />
242
+ </OptionGroup>
243
+ <OptionGroup label="蔬菜">
244
+ <Option value="tomato" label="番茄" />
245
+ <Option value="potato" label="土豆" />
246
+ </OptionGroup>
247
+ </Select>
248
+ </template>
249
+ ```
95
250
 
96
251
  ## 常见错误与正确用法 (Anti-Hallucination)
252
+ ### 多选模式下 value 类型错误
97
253
  > **错误用法**: `const selected = ref('');
98
254
  <Select v-model="selected" multiple>`
99
255
  > **正确写法**: `const selected = ref<string[]>([]);
100
256
  <Select v-model="selected" multiple>`
101
257
  > **说明**: 使用 multiple 多选模式时,value 必须是数组类型,而非字符串
102
258
 
259
+ ### Option 未设置 value 属性
103
260
  > **错误用法**: `<Select v-model="selected">
104
261
  <Option label="苹果" />
105
262
  </Select>`
@@ -108,10 +265,12 @@ const handleHide = () => {
108
265
  </Select>`
109
266
  > **说明**: Option 必须设置 value 属性,否则无法正确绑定选中值
110
267
 
268
+ ### 使用不存在的 size 值 (Select)
111
269
  > **错误用法**: `<Select size="medium">`
112
270
  > **正确写法**: `<Select size="default">`
113
271
  > **说明**: Select 的 size 只支持 large, default, small, mini。常见错误是使用 medium 值。
114
272
 
273
+ ### 使用 creatable 但未启用 filterable
115
274
  > **错误用法**: `<Select creatable>`
116
275
  > **正确写法**: `<Select filterable creatable>`
117
276
  > **说明**: creatable 属性需要配合 filterable 使用,因为创建新选项需要用户输入
@@ -0,0 +1,133 @@
1
+ # 侧边导航 (Sidebar)
2
+
3
+ 用于控制台左侧导航的多层级菜单组件,支持路由联动、展开状态管理和默认选中逻辑。
4
+
5
+ **关键词**: sidebar, navigation, menu tree, 侧边栏, 菜单导航, 多级菜单, 控制台导航, 左侧导航
6
+
7
+ **使用场景**: 控制台左侧导航、多级菜单导航、资源中心侧边菜单、路由驱动的后台导航
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { Sidebar } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | title | `string` | `undefined` | 否 | 侧边栏标题 | - | - |
18
+ | selectedKey | `Key` | `undefined` | 否 | 当前选中的菜单 key | - | - |
19
+ | expandedKeys | `Key[]` | `undefined` | 否 | 当前展开的菜单 key 列表 | - | - |
20
+ | menus | `Menus` | `undefined` | 是 | 菜单配置树 | - | - |
21
+ | router | `boolean` | `false` | 否 | 是否启用路由模式 | - | - |
22
+ | autoSelectDefault | `boolean` | `true` | 否 | 未匹配到路由时是否自动选中默认菜单项 | - | - |
23
+
24
+ ## 事件 (Events)
25
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
26
+ | --- | --- | --- | --- | --- |
27
+ | update:selectedKey | `@update:selectedKey` | 当前选中菜单 key 变化时触发,可用于同步路由或高亮状态。 | `value?: string` | - |
28
+ | update:expandedKeys | `@update:expandedKeys` | 展开的菜单节点变化时触发,适合持久化用户展开习惯。 | `value?: string[]` | - |
29
+ | update:menuItem | `@update:menuItem` | 当前选中的完整菜单项变化时触发,便于读取标题、路由等附加字段。 | `value?: SidebarMenuItem` | - |
30
+ | change:menus | `@change:menus` | 菜单结构变化时触发,适合动态菜单加载后重新同步状态。 | `value?: SidebarMenuItem[]` | - |
31
+
32
+ ### 事件参数说明
33
+ **update:selectedKey**
34
+
35
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
36
+ | --- | --- | --- | --- | --- |
37
+ | value | `string` | 否 | - | 当前选中的菜单 key。 |
38
+
39
+ **update:expandedKeys**
40
+
41
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
42
+ | --- | --- | --- | --- | --- |
43
+ | value | `string[]` | 否 | - | 当前处于展开状态的菜单 key 列表。 |
44
+
45
+ **update:menuItem**
46
+
47
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
48
+ | --- | --- | --- | --- | --- |
49
+ | value | `SidebarMenuItem` | 否 | - | 当前命中的菜单项对象,包含标题、路由参数和 children 等扩展字段。 |
50
+
51
+ **change:menus**
52
+
53
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
54
+ | --- | --- | --- | --- | --- |
55
+ | value | `SidebarMenuItem[]` | 否 | - | 当前可渲染的菜单树数组,常用于动态菜单加载后做缓存或二次处理。 |
56
+
57
+ ## 使用示例
58
+ ### 控制台侧边导航
59
+ **场景**: 在控制台左侧展示资源管理导航。
60
+
61
+ 渲染一个带二级菜单的控制台导航树。
62
+
63
+ **使用的 API**: 属性: title, selectedKey, expandedKeys, menus | 事件: update:selectedKey, update:expandedKeys
64
+
65
+ ```vue
66
+ <script setup lang="ts">
67
+ import { ref } from 'vue';
68
+ import { Sidebar } from '@ksyun-internal/versatile';
69
+
70
+ const selectedKey = ref('instances');
71
+ const expandedKeys = ref(['compute']);
72
+ const menus = [
73
+ {
74
+ key: 'compute',
75
+ label: '计算',
76
+ children: [
77
+ { key: 'instances', label: '实例列表' },
78
+ { key: 'images', label: '镜像' },
79
+ ],
80
+ },
81
+ ];
82
+ </script>
83
+
84
+ <template>
85
+ <Sidebar
86
+ title="云服务器"
87
+ v-model:selected-key="selectedKey"
88
+ v-model:expanded-keys="expandedKeys"
89
+ :menus="menus"
90
+ />
91
+ </template>
92
+ ```
93
+
94
+ ### 路由模式侧边导航
95
+ **场景**: 在多级控制台中让菜单选中状态与 URL 同步。
96
+
97
+ 在路由驱动的控制台中让侧边栏自动和当前页面同步。
98
+
99
+ **使用的 API**: 属性: selectedKey, expandedKeys, menus, router, autoSelectDefault | 事件: update:selectedKey, update:expandedKeys
100
+
101
+ ```vue
102
+ <script setup lang="ts">
103
+ import { ref } from 'vue';
104
+ import { Sidebar } from '@ksyun-internal/versatile';
105
+
106
+ const selectedKey = ref('dashboard');
107
+ const expandedKeys = ref(['overview']);
108
+ const menus = [
109
+ {
110
+ key: 'overview',
111
+ label: '概览',
112
+ children: [
113
+ { key: 'dashboard', label: '仪表盘' },
114
+ { key: 'alerts', label: '告警中心' },
115
+ ],
116
+ },
117
+ ];
118
+ </script>
119
+
120
+ <template>
121
+ <Sidebar
122
+ v-model:selected-key="selectedKey"
123
+ v-model:expanded-keys="expandedKeys"
124
+ :menus="menus"
125
+ :router="true"
126
+ :auto-select-default="false"
127
+ />
128
+ </template>
129
+ ```
130
+
131
+ ## 相关组件
132
+ Header, LayoutContent
133
+