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.
- package/components/actions.json +101 -0
- package/components/advancedset.json +127 -0
- package/components/affix.json +7 -0
- package/components/aksk.json +172 -0
- package/components/az.json +15 -2
- package/components/badge.json +7 -0
- package/components/billtypes.json +14 -2
- package/components/breadcrumb.json +7 -0
- package/components/button.json +191 -0
- package/components/buttonlink.json +73 -0
- package/components/card.json +8 -1
- package/components/cardcol.json +142 -0
- package/components/cardcols.json +121 -0
- package/components/cardcontent.json +15 -3
- package/components/cardtabs.json +172 -0
- package/components/carousel.json +7 -0
- package/components/cascader.json +520 -368
- package/components/checkbox.json +51 -4
- package/components/cidrinput.json +140 -0
- package/components/code.json +8 -1
- package/components/collapse.json +7 -0
- package/components/colorpicker.json +217 -0
- package/components/copy.json +7 -0
- package/components/copyhover.json +111 -0
- package/components/copyrow.json +124 -0
- package/components/datepicker.json +656 -524
- package/components/description.json +98 -0
- package/components/dialog.json +522 -455
- package/components/divider.json +8 -1
- package/components/drawer.json +571 -558
- package/components/dropdown.json +464 -384
- package/components/duration.json +125 -0
- package/components/editable.json +66 -0
- package/components/ellipsis.json +34 -1
- package/components/filtertablefieldsdialog.json +128 -0
- package/components/flex.json +151 -0
- package/components/form.json +131 -0
- package/components/formiteminput.json +214 -0
- package/components/formitemspinner.json +213 -0
- package/components/formitemswitch.json +185 -0
- package/components/formitemtableconfigs.json +210 -0
- package/components/grid.json +7 -0
- package/components/header.json +161 -0
- package/components/icon.json +13 -1
- package/components/icontooltip.json +19 -1
- package/components/input.json +188 -4
- package/components/instancelist.json +194 -0
- package/components/instancenum.json +196 -0
- package/components/ipinput.json +117 -0
- package/components/kspstatus.json +205 -0
- package/components/kvcode.json +120 -0
- package/components/layoutcontent.json +15 -3
- package/components/layoutlistcontent.json +148 -0
- package/components/layoutpermissioncontent.json +155 -0
- package/components/layoutstandardlist.json +275 -0
- package/components/layouttabs.json +168 -0
- package/components/lazymount.json +86 -0
- package/components/lazyteleport.json +118 -0
- package/components/menu.json +7 -0
- package/components/pagination.json +12 -0
- package/components/paginationplus.json +30 -3
- package/components/password.json +121 -0
- package/components/popover.json +457 -437
- package/components/projects.json +129 -0
- package/components/protable.json +97 -8
- package/components/queuevisualrange.json +110 -0
- package/components/radio.json +82 -2
- package/components/rate.json +199 -0
- package/components/region.json +14 -2
- package/components/search.json +221 -0
- package/components/searchinput.json +132 -0
- package/components/searchitems.json +215 -0
- package/components/searchselect.json +195 -0
- package/components/select.json +686 -666
- package/components/sidebar.json +198 -0
- package/components/skeleton.json +233 -0
- package/components/spin.json +8 -1
- package/components/split.json +260 -0
- package/components/sshkeys.json +138 -0
- package/components/status.json +60 -3
- package/components/steps.json +7 -0
- package/components/switch.json +8 -1
- package/components/table.json +18 -1
- package/components/tablecolumnid.json +14 -2
- package/components/tabs.json +12 -0
- package/components/timeline.json +213 -0
- package/components/timepicker.json +147 -3
- package/components/timerange.json +262 -0
- package/components/tip.json +7 -0
- package/components/tooltip.json +484 -395
- package/components/tour.json +418 -372
- package/components/transfer.json +27 -3
- package/components/tree.json +6 -4
- package/components/treeselect.json +556 -475
- package/components/upload.json +474 -473
- package/components/vdialog.json +308 -0
- package/components/vdrawer.json +331 -0
- package/components/virtuallist.json +7 -0
- package/dist/ast/index.d.mts +35 -1
- package/dist/ast/index.d.ts +35 -1
- package/dist/ast/index.js +4 -3
- package/dist/ast/index.mjs +2 -1
- package/dist/{chunk-DSWKLUIX.mjs → chunk-3LYQ5XFM.mjs} +1 -1
- package/dist/chunk-BI5TIQID.mjs +330 -0
- package/dist/{chunk-F26GUCGG.js → chunk-CJGGFVQJ.js} +8 -8
- package/dist/chunk-CR3GC4H3.js +353 -0
- package/dist/{chunk-NZ6TLWMD.mjs → chunk-D2SXGGTX.mjs} +28 -17
- package/dist/{chunk-D3Y6FGWA.js → chunk-EYKZY2F3.js} +29 -18
- package/dist/chunk-KF5YBEM5.js +143 -0
- package/dist/{chunk-H2ET6MMM.mjs → chunk-KMIDURUR.mjs} +42 -47
- package/dist/chunk-QC6VTSA3.mjs +117 -0
- package/dist/{chunk-2W6OCG2S.js → chunk-SZYVGYKK.js} +42 -48
- package/dist/{chunk-WYSRJVX4.js → chunk-TA3SV4SP.js} +2 -2
- package/dist/{chunk-OJOHB64C.mjs → chunk-XGPHQHLR.mjs} +4 -4
- package/dist/full/index.js +7 -6
- package/dist/full/index.mjs +5 -4
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +14 -13
- package/dist/index.mjs +6 -5
- package/dist/metadata/index.d.mts +22 -2
- package/dist/metadata/index.d.ts +22 -2
- package/dist/metadata/index.js +26 -16
- package/dist/metadata/index.mjs +26 -15
- package/dist/resolve-BsLBxlBi.d.mts +24 -0
- package/dist/resolve-BsLBxlBi.d.ts +24 -0
- package/dist/runtime/index.js +4 -4
- package/dist/runtime/index.mjs +2 -2
- package/dist/shared/index.d.mts +10 -0
- package/dist/shared/index.d.ts +10 -0
- package/dist/shared/index.js +23 -0
- package/dist/shared/index.mjs +2 -0
- package/dist/static/index.js +5 -5
- package/dist/static/index.mjs +2 -2
- package/docs_for_llm/actions.doc.md +77 -0
- package/docs_for_llm/advancedset.doc.md +89 -0
- package/docs_for_llm/affix.doc.md +15 -7
- package/docs_for_llm/aksk.doc.md +111 -0
- package/docs_for_llm/az.doc.md +17 -11
- package/docs_for_llm/badge.doc.md +6 -5
- package/docs_for_llm/billtypes.doc.md +17 -11
- package/docs_for_llm/breadcrumb.doc.md +6 -3
- package/docs_for_llm/button.doc.md +34 -18
- package/docs_for_llm/buttonlink.doc.md +55 -0
- package/docs_for_llm/card.doc.md +8 -5
- package/docs_for_llm/cardcol.doc.md +78 -0
- package/docs_for_llm/cardcols.doc.md +84 -0
- package/docs_for_llm/cardcontent.doc.md +10 -10
- package/docs_for_llm/cardtabs.doc.md +106 -0
- package/docs_for_llm/carousel.doc.md +8 -7
- package/docs_for_llm/cascader.doc.md +46 -25
- package/docs_for_llm/checkbox.doc.md +25 -13
- package/docs_for_llm/cidrinput.doc.md +83 -0
- package/docs_for_llm/code.doc.md +22 -11
- package/docs_for_llm/collapse.doc.md +9 -6
- package/docs_for_llm/colorpicker.doc.md +104 -0
- package/docs_for_llm/copy.doc.md +15 -13
- package/docs_for_llm/copyhover.doc.md +59 -0
- package/docs_for_llm/copyrow.doc.md +71 -0
- package/docs_for_llm/datepicker.doc.md +51 -39
- package/docs_for_llm/description.doc.md +75 -0
- package/docs_for_llm/descriptions.doc.md +9 -6
- package/docs_for_llm/dialog.doc.md +48 -77
- package/docs_for_llm/divider.doc.md +9 -7
- package/docs_for_llm/drawer.doc.md +43 -84
- package/docs_for_llm/dropdown.doc.md +52 -21
- package/docs_for_llm/duration.doc.md +76 -0
- package/docs_for_llm/editable.doc.md +36 -14
- package/docs_for_llm/ellipsis.doc.md +10 -5
- package/docs_for_llm/filtertablefieldsdialog.doc.md +99 -0
- package/docs_for_llm/flex.doc.md +74 -0
- package/docs_for_llm/form.doc.md +33 -14
- package/docs_for_llm/formiteminput.doc.md +128 -0
- package/docs_for_llm/formitemspinner.doc.md +105 -0
- package/docs_for_llm/formitemswitch.doc.md +113 -0
- package/docs_for_llm/formitemtableconfigs.doc.md +95 -0
- package/docs_for_llm/grid.doc.md +7 -5
- package/docs_for_llm/header.doc.md +85 -0
- package/docs_for_llm/icon.doc.md +12 -8
- package/docs_for_llm/icontooltip.doc.md +121 -0
- package/docs_for_llm/input.doc.md +90 -39
- package/docs_for_llm/instancelist.doc.md +113 -0
- package/docs_for_llm/instancenum.doc.md +95 -0
- package/docs_for_llm/ipinput.doc.md +77 -0
- package/docs_for_llm/kspstatus.doc.md +82 -0
- package/docs_for_llm/kvcode.doc.md +76 -0
- package/docs_for_llm/layoutcontent.doc.md +17 -17
- package/docs_for_llm/layoutlistcontent.doc.md +95 -0
- package/docs_for_llm/layoutpermissioncontent.doc.md +84 -0
- package/docs_for_llm/layoutstandardlist.doc.md +120 -0
- package/docs_for_llm/layouttabs.doc.md +101 -0
- package/docs_for_llm/lazymount.doc.md +73 -0
- package/docs_for_llm/lazyteleport.doc.md +76 -0
- package/docs_for_llm/menu.doc.md +14 -11
- package/docs_for_llm/message.doc.md +48 -10
- package/docs_for_llm/pagination.doc.md +30 -17
- package/docs_for_llm/paginationplus.doc.md +31 -10
- package/docs_for_llm/password.doc.md +86 -0
- package/docs_for_llm/popover.doc.md +24 -55
- package/docs_for_llm/progress.doc.md +13 -10
- package/docs_for_llm/projects.doc.md +91 -0
- package/docs_for_llm/protable.doc.md +89 -15
- package/docs_for_llm/queuevisualrange.doc.md +78 -0
- package/docs_for_llm/radio.doc.md +23 -8
- package/docs_for_llm/rate.doc.md +122 -0
- package/docs_for_llm/region.doc.md +25 -13
- package/docs_for_llm/search.doc.md +120 -0
- package/docs_for_llm/searchinput.doc.md +111 -0
- package/docs_for_llm/searchitems.doc.md +116 -0
- package/docs_for_llm/searchselect.doc.md +126 -0
- package/docs_for_llm/select.doc.md +40 -55
- package/docs_for_llm/sidebar.doc.md +133 -0
- package/docs_for_llm/skeleton.doc.md +117 -0
- package/docs_for_llm/slider.doc.md +31 -21
- package/docs_for_llm/spin.doc.md +8 -5
- package/docs_for_llm/spinner.doc.md +28 -18
- package/docs_for_llm/split.doc.md +157 -0
- package/docs_for_llm/sshkeys.doc.md +88 -0
- package/docs_for_llm/status.doc.md +14 -9
- package/docs_for_llm/steps.doc.md +10 -7
- package/docs_for_llm/switch.doc.md +17 -14
- package/docs_for_llm/table.doc.md +118 -51
- package/docs_for_llm/tablecolumnid.doc.md +36 -16
- package/docs_for_llm/tabs.doc.md +19 -10
- package/docs_for_llm/tag.doc.md +19 -10
- package/docs_for_llm/timeline.doc.md +109 -0
- package/docs_for_llm/timepicker.doc.md +57 -38
- package/docs_for_llm/timerange.doc.md +157 -0
- package/docs_for_llm/tip.doc.md +20 -11
- package/docs_for_llm/tooltip.doc.md +55 -29
- package/docs_for_llm/tour.doc.md +48 -29
- package/docs_for_llm/transfer.doc.md +40 -29
- package/docs_for_llm/tree.doc.md +65 -23
- package/docs_for_llm/treeselect.doc.md +37 -48
- package/docs_for_llm/upload.doc.md +56 -32
- package/docs_for_llm/useCRUD.doc.md +49 -0
- package/docs_for_llm/useCountdown.doc.md +43 -0
- package/docs_for_llm/useDetail.doc.md +48 -0
- package/docs_for_llm/useDialog.doc.md +46 -0
- package/docs_for_llm/useEntity.doc.md +45 -0
- package/docs_for_llm/useEventListener.doc.md +44 -0
- package/docs_for_llm/useFalseUntilTruthy.doc.md +41 -0
- package/docs_for_llm/useGetCopyAuthText.doc.md +35 -0
- package/docs_for_llm/useGetUserPermission.doc.md +43 -0
- package/docs_for_llm/useGroup.doc.md +48 -0
- package/docs_for_llm/useIdEntities.doc.md +48 -0
- package/docs_for_llm/useIdEntity.doc.md +103 -0
- package/docs_for_llm/useInterval.doc.md +43 -0
- package/docs_for_llm/useLayoutStandardList.doc.md +38 -0
- package/docs_for_llm/useMessage.doc.md +46 -0
- package/docs_for_llm/useModifyCache.doc.md +37 -0
- package/docs_for_llm/useOpenDialog.doc.md +41 -0
- package/docs_for_llm/usePagination.doc.md +60 -0
- package/docs_for_llm/usePersist.doc.md +54 -0
- package/docs_for_llm/usePoll.doc.md +41 -0
- package/docs_for_llm/useRoutePlus.doc.md +34 -0
- package/docs_for_llm/useRouterPlus.doc.md +34 -0
- package/docs_for_llm/useSearch.doc.md +68 -0
- package/docs_for_llm/useShell.doc.md +43 -0
- package/docs_for_llm/useSkip.doc.md +41 -0
- package/docs_for_llm/useStorageIdEntity.doc.md +46 -0
- package/docs_for_llm/useStore.doc.md +34 -0
- package/docs_for_llm/useTable.doc.md +57 -0
- package/docs_for_llm/useTableGroup.doc.md +47 -0
- package/docs_for_llm/useTableSort.doc.md +40 -0
- package/docs_for_llm/useToState.doc.md +112 -0
- package/docs_for_llm/useUser.doc.md +38 -0
- package/docs_for_llm/useValidForm.doc.md +41 -0
- package/docs_for_llm/vdialog.doc.md +129 -0
- package/docs_for_llm/vdrawer.doc.md +119 -0
- package/docs_for_llm/virtuallist.doc.md +6 -3
- package/hooks/useCRUD.json +61 -0
- package/hooks/useCountdown.json +49 -0
- package/hooks/useDetail.json +67 -0
- package/hooks/useDialog.json +49 -0
- package/hooks/useEntity.json +61 -0
- package/hooks/useEventListener.json +61 -0
- package/hooks/useFalseUntilTruthy.json +43 -0
- package/hooks/useGetCopyAuthText.json +36 -0
- package/hooks/useGetUserPermission.json +55 -0
- package/hooks/useGroup.json +49 -0
- package/hooks/useIdEntities.json +61 -0
- package/hooks/useInterval.json +55 -0
- package/hooks/useLayoutStandardList.json +36 -0
- package/hooks/useMessage.json +73 -0
- package/hooks/useModifyCache.json +36 -0
- package/hooks/useOpenDialog.json +43 -0
- package/hooks/usePagination.json +49 -0
- package/hooks/usePersist.json +61 -0
- package/hooks/usePoll.json +43 -0
- package/hooks/useRoutePlus.json +36 -0
- package/hooks/useRouterPlus.json +36 -0
- package/hooks/useSearch.json +56 -0
- package/hooks/useShell.json +49 -0
- package/hooks/useSkip.json +43 -0
- package/hooks/useStorageIdEntity.json +67 -0
- package/hooks/useStore.json +36 -0
- package/hooks/useTable.json +49 -0
- package/hooks/useTableGroup.json +43 -0
- package/hooks/useTableSort.json +43 -0
- package/hooks/useUser.json +36 -0
- package/hooks/useValidForm.json +43 -0
- package/package.json +12 -6
- package/dist/chunk-HPAUCD5I.js +0 -156
- package/dist/chunk-L4DS3EXI.mjs +0 -133
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 增删行状态管理 (useCRUD)
|
|
2
|
+
|
|
3
|
+
管理数组型表单项的新增与删除能力,并根据最大最小数量约束生成可直接用于按钮禁用态的结果。
|
|
4
|
+
|
|
5
|
+
**关键词**: useCRUD, 动态表单, 新增 删除, 数组项, canAdd, canDelete
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useCRUD } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| models | `Ref<T[]>` | 是 | 当前表单项数组 |
|
|
16
|
+
| initItem | `() => T` | 是 | 新增项的初始化工厂函数 |
|
|
17
|
+
| maxInstanceNum | `number` | 否 | 最大可新增数量 |
|
|
18
|
+
| minInstanceNum | `number` | 否 | 最小保留数量 |
|
|
19
|
+
|
|
20
|
+
## 返回值
|
|
21
|
+
```typescript
|
|
22
|
+
{ canAdd: ComputedRef<{ disabled: boolean; msg: string }>; canDelete: ComputedRef<{ disabled: boolean; msg: string }>; addItem: () => void; deleteItem: (index: number) => void; }
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
26
|
+
### 直接复用同一个默认对象,导致新增项互相串值
|
|
27
|
+
> **错误用法**: `const defaultItem = { name: '', value: '' }; useCRUD(models, () => defaultItem);`
|
|
28
|
+
> **正确写法**: `useCRUD(models, () => ({ name: '', value: '' }));`
|
|
29
|
+
> **说明**: initItem 应返回新的对象实例,避免多个表单项共享引用。
|
|
30
|
+
|
|
31
|
+
## 使用示例
|
|
32
|
+
### 动态表单行增删
|
|
33
|
+
控制实例配置行的新增与删除
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<script setup lang="ts">
|
|
37
|
+
import { ref } from 'vue';
|
|
38
|
+
import { useCRUD } from '@ksyun-internal/versatile';
|
|
39
|
+
|
|
40
|
+
const models = ref([{ name: '', value: '' }]);
|
|
41
|
+
const { canAdd, canDelete, addItem, deleteItem } = useCRUD(
|
|
42
|
+
models,
|
|
43
|
+
() => ({ name: '', value: '' }),
|
|
44
|
+
5,
|
|
45
|
+
1
|
|
46
|
+
);
|
|
47
|
+
</script>
|
|
48
|
+
```
|
|
49
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 倒计时 (useCountdown)
|
|
2
|
+
|
|
3
|
+
管理秒级或自定义间隔的倒计时流程,提供 start、reset、stop 和 pause/resume 等控制能力。
|
|
4
|
+
|
|
5
|
+
**关键词**: useCountdown, 倒计时, remaining, 短信验证码, start stop, pause resume
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useCountdown } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| initialCountdown | `MaybeRefOrGetter<number>` | 是 | 初始倒计时值 |
|
|
16
|
+
| options | `UseCountdownOptions` | 否 | 倒计时配置,可设置 interval、immediate、onTick 和 onComplete |
|
|
17
|
+
|
|
18
|
+
## 返回值
|
|
19
|
+
```typescript
|
|
20
|
+
{ remaining: ShallowRef<number>; isActive: Readonly<ShallowRef<boolean>>; pause: () => void; resume: () => void; reset: (countdown?: MaybeRefOrGetter<number>) => void; stop: () => void; start: (countdown?: MaybeRefOrGetter<number>) => void; }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
24
|
+
### 把 resume 当作重新开始倒计时使用
|
|
25
|
+
> **错误用法**: `resume();`
|
|
26
|
+
> **正确写法**: `start(); // 或 reset(60) 后再 start()`
|
|
27
|
+
> **说明**: resume 只用于恢复暂停中的倒计时,不会重置剩余时间。
|
|
28
|
+
|
|
29
|
+
## 使用示例
|
|
30
|
+
### 短信验证码倒计时
|
|
31
|
+
点击发送验证码后开始倒计时
|
|
32
|
+
|
|
33
|
+
```vue
|
|
34
|
+
<script setup lang="ts">
|
|
35
|
+
import { useCountdown } from '@ksyun-internal/versatile';
|
|
36
|
+
|
|
37
|
+
const { remaining, start, stop } = useCountdown(60, {
|
|
38
|
+
immediate: false,
|
|
39
|
+
onComplete: () => console.log('倒计时结束'),
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
```
|
|
43
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# 详情页状态守卫 (useDetail)
|
|
2
|
+
|
|
3
|
+
围绕详情页数据、网络状态和路由跳转封装守卫逻辑,适合详情页数据为空、请求异常或需要回退列表页的场景。
|
|
4
|
+
|
|
5
|
+
**关键词**: useDetail, 详情页, networkStatus, 详情守卫, 异常跳转, refetch
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useDetail } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| detailData | `Ref<T | null | undefined>` | 是 | 详情数据响应式对象 |
|
|
16
|
+
| networkStatus | `Ref<number | undefined>` | 是 | 网络状态响应式值 |
|
|
17
|
+
| routerName | `string | RouteLocationAsRelativeGeneric | RouteLocationAsPathGeneric` | 否 | 异常时回退的路由信息 |
|
|
18
|
+
| refetch | `() => void` | 否 | 重新拉取详情数据的方法 |
|
|
19
|
+
| tip | `string` | 否 | 详情不存在或异常时展示的提示文案 |
|
|
20
|
+
|
|
21
|
+
## 返回值
|
|
22
|
+
```typescript
|
|
23
|
+
void
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
27
|
+
### 只传详情数据,没有把网络状态传给 hook,导致无法区分加载中和异常态
|
|
28
|
+
> **错误用法**: `useDetail(detailData);`
|
|
29
|
+
> **正确写法**: `useDetail(detailData, networkStatus, 'instance-list');`
|
|
30
|
+
> **说明**: networkStatus 是 hook 判断详情状态的重要输入。
|
|
31
|
+
|
|
32
|
+
## 使用示例
|
|
33
|
+
### 详情页请求守卫
|
|
34
|
+
在详情页请求为空或异常时统一处理跳转和重试
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { ref } from 'vue';
|
|
39
|
+
import { useDetail } from '@ksyun-internal/versatile';
|
|
40
|
+
|
|
41
|
+
const detailData = ref();
|
|
42
|
+
const networkStatus = ref(7);
|
|
43
|
+
const refetch = () => console.log('retry');
|
|
44
|
+
|
|
45
|
+
useDetail(detailData, networkStatus, { name: 'instance-list' }, refetch, '实例不存在');
|
|
46
|
+
</script>
|
|
47
|
+
```
|
|
48
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 弹窗状态管理 (useDialog)
|
|
2
|
+
|
|
3
|
+
为 VDialog 或 Dialog 表单场景封装显隐、校验、重置和确认按钮行为,减少弹窗表单模板中的重复状态代码。
|
|
4
|
+
|
|
5
|
+
**关键词**: useDialog, VDialog, 弹窗表单, dialog, validate, show hide
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useDialog } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| emit | `() => any` | 否 | 父组件传入的 emit,用于联动弹窗显隐或外部事件 |
|
|
16
|
+
| isShowParentDialog | `Ref<boolean | undefined>` | 否 | 父级弹窗显隐状态,适合嵌套弹窗场景 |
|
|
17
|
+
|
|
18
|
+
## 返回值
|
|
19
|
+
```typescript
|
|
20
|
+
{ dialogRef: Ref<Dialog | undefined>; isShowDialog: Ref<boolean>; formRef: Ref<Form | undefined>; validate: Function; validateByScroll: Function; reset: Function; handleClickOkBtn: Function; handleClickValidOkBtn: Function; show: Function; hide: Function; }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
24
|
+
### 调用 validate 或 handleClickValidOkBtn,但没有把 formRef 绑定到表单
|
|
25
|
+
> **错误用法**: `<Form></Form>`
|
|
26
|
+
> **正确写法**: `<Form ref="formRef"></Form>`
|
|
27
|
+
> **说明**: 校验相关方法依赖 formRef 指向真实表单实例。
|
|
28
|
+
|
|
29
|
+
## 使用示例
|
|
30
|
+
### 弹窗表单
|
|
31
|
+
配合 VDialog 管理弹窗显隐和表单校验
|
|
32
|
+
|
|
33
|
+
```vue
|
|
34
|
+
<script setup lang="ts">
|
|
35
|
+
import { VDialog, useDialog } from '@ksyun-internal/versatile';
|
|
36
|
+
|
|
37
|
+
const { isShowDialog, formRef, show, hide, handleClickValidOkBtn } = useDialog();
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<VDialog v-model="isShowDialog" :ok="handleClickValidOkBtn">
|
|
42
|
+
<Form ref="formRef"></Form>
|
|
43
|
+
</VDialog>
|
|
44
|
+
</template>
|
|
45
|
+
```
|
|
46
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 基础实体映射 (useEntity)
|
|
2
|
+
|
|
3
|
+
根据单个 ID 和基础列表做实体同步回调,适合简单的字符串或数字值映射场景。
|
|
4
|
+
|
|
5
|
+
**关键词**: useEntity, 简单实体映射, id value, 回调同步, 基础列表, 单值
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useEntity } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| id | `Ref<string | number | undefined | null>` | 是 | 当前选中的 ID |
|
|
16
|
+
| list | `Ref<string[] | number[] | undefined | null>` | 是 | 基础值列表 |
|
|
17
|
+
| emit | `(entity: string | number | null | undefined) => void` | 否 | 值变化时的回调 |
|
|
18
|
+
| isNeedDefaultValue | `boolean` | 否 | 是否需要默认值处理 |
|
|
19
|
+
|
|
20
|
+
## 返回值
|
|
21
|
+
```typescript
|
|
22
|
+
void
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
26
|
+
### 把 useEntity 当成返回实体 Ref 的 hook 使用
|
|
27
|
+
> **错误用法**: `const entity = useEntity(id, list);`
|
|
28
|
+
> **正确写法**: `useEntity(id, list, (entity) => { current.value = entity; });`
|
|
29
|
+
> **说明**: 该 hook 主要通过副作用回调同步值,本身不返回实体 Ref。
|
|
30
|
+
|
|
31
|
+
## 使用示例
|
|
32
|
+
### 基础值映射
|
|
33
|
+
根据当前值从列表里查找对应实体并回调给外层
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<script setup lang="ts">
|
|
37
|
+
import { ref } from 'vue';
|
|
38
|
+
import { useEntity } from '@ksyun-internal/versatile';
|
|
39
|
+
|
|
40
|
+
const id = ref('cn-beijing-6a');
|
|
41
|
+
const list = ref(['cn-beijing-6a', 'cn-shanghai-2a']);
|
|
42
|
+
useEntity(id, list, (entity) => console.log(entity));
|
|
43
|
+
</script>
|
|
44
|
+
```
|
|
45
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 事件监听封装 (useEventListener)
|
|
2
|
+
|
|
3
|
+
为 HTMLElement、window、document 或 Ref 目标统一注册事件监听,并支持 throttle、debounce 与原生 addEventListener 配置。
|
|
4
|
+
|
|
5
|
+
**关键词**: useEventListener, 事件监听, window resize, debounce, throttle, addEventListener
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useEventListener } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| target | `HTMLElement | Window | Document | Ref<HTMLElement | null> | (() => HTMLElement | null)` | 是 | 监听目标 |
|
|
16
|
+
| event | `string` | 是 | 事件名 |
|
|
17
|
+
| handler | `EventListenerOrEventListenerObject` | 是 | 事件处理函数 |
|
|
18
|
+
| options | `{ throttle?: number; debounce?: number; nativeOptions?: boolean | AddEventListenerOptions }` | 否 | 监听配置,支持节流、防抖和原生监听选项 |
|
|
19
|
+
|
|
20
|
+
## 返回值
|
|
21
|
+
```typescript
|
|
22
|
+
void
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
26
|
+
### 同时配置 throttle 和 debounce,但没有明确预期
|
|
27
|
+
> **错误用法**: `useEventListener(window, 'scroll', onScroll, { throttle: 100, debounce: 100 });`
|
|
28
|
+
> **正确写法**: `根据场景二选一:节流滚动用 throttle,输入联想用 debounce。`
|
|
29
|
+
> **说明**: 两者语义不同,建议根据业务场景明确选一种。
|
|
30
|
+
|
|
31
|
+
## 使用示例
|
|
32
|
+
### 监听窗口尺寸变化
|
|
33
|
+
在页面中节流监听 resize 事件
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<script setup lang="ts">
|
|
37
|
+
import { useEventListener } from '@ksyun-internal/versatile';
|
|
38
|
+
|
|
39
|
+
useEventListener(window, 'resize', () => {
|
|
40
|
+
console.log('resize');
|
|
41
|
+
}, { throttle: 200 });
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 延迟转真布尔态 (useFalseUntilTruthy)
|
|
2
|
+
|
|
3
|
+
将任意响应式值映射成布尔值,并在首次变为 truthy 前始终保持 false,适合权限、异步加载完成态和懒渲染控制。
|
|
4
|
+
|
|
5
|
+
**关键词**: useFalseUntilTruthy, false until truthy, 懒渲染, 加载完成, 布尔态, 权限准备
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useFalseUntilTruthy } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| value | `MaybeRefOrGetter<any>` | 是 | 任意响应式值、getter 或普通值 |
|
|
16
|
+
|
|
17
|
+
## 返回值
|
|
18
|
+
```typescript
|
|
19
|
+
Readonly<Ref<boolean>>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
23
|
+
### 期望值在 truthy 之后再次回到 false
|
|
24
|
+
> **错误用法**: `const visible = useFalseUntilTruthy(flag); // 认为 flag 再次 false 时 visible 也会 false`
|
|
25
|
+
> **正确写法**: `如需双向切换,请直接使用 computed(() => !!flag.value)`
|
|
26
|
+
> **说明**: 这个 hook 的语义是“在首次变为 truthy 前保持 false”,不是通用的布尔映射。
|
|
27
|
+
|
|
28
|
+
## 使用示例
|
|
29
|
+
### 控制懒渲染
|
|
30
|
+
在异步数据真正可用前保持 false,避免中间闪烁
|
|
31
|
+
|
|
32
|
+
```vue
|
|
33
|
+
<script setup lang="ts">
|
|
34
|
+
import { computed } from 'vue';
|
|
35
|
+
import { useFalseUntilTruthy } from '@ksyun-internal/versatile';
|
|
36
|
+
|
|
37
|
+
const dataReady = computed(() => true);
|
|
38
|
+
const canRender = useFalseUntilTruthy(dataReady);
|
|
39
|
+
</script>
|
|
40
|
+
```
|
|
41
|
+
|
|
@@ -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
|
+
|