king-design-analyzer 2.1.7 → 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 +5 -3
- package/dist/ast/index.mjs +3 -1
- package/dist/{chunk-DSWKLUIX.mjs → chunk-3LYQ5XFM.mjs} +1 -1
- package/dist/chunk-BI5TIQID.mjs +330 -0
- package/dist/{chunk-6QS5IGS6.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-JSBRDJBE.js +30 -0
- package/dist/chunk-KF5YBEM5.js +143 -0
- package/dist/chunk-KMIDURUR.mjs +33324 -0
- package/dist/chunk-QC6VTSA3.mjs +117 -0
- package/dist/chunk-SZYVGYKK.js +33350 -0
- package/dist/{chunk-WYSRJVX4.js → chunk-TA3SV4SP.js} +2 -2
- package/dist/chunk-UJCSKKID.mjs +27 -0
- package/dist/{chunk-FVSQ6BU6.mjs → chunk-XGPHQHLR.mjs} +4 -4
- package/dist/docs/index.js +1 -1
- package/dist/docs/index.mjs +1 -1
- package/dist/full/index.js +8 -6
- package/dist/full/index.mjs +6 -4
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -13
- package/dist/index.mjs +7 -5
- package/dist/metadata/index.d.mts +22 -2
- package/dist/metadata/index.d.ts +22 -2
- package/dist/metadata/index.js +27 -17
- package/dist/metadata/index.mjs +27 -16
- package/dist/resolve-BsLBxlBi.d.mts +24 -0
- package/dist/resolve-BsLBxlBi.d.ts +24 -0
- package/dist/runtime/index.js +5 -4
- package/dist/runtime/index.mjs +3 -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 +6 -5
- package/dist/static/index.mjs +3 -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-HDV7ETXE.mjs +0 -1055
- package/dist/chunk-HPAUCD5I.js +0 -156
- package/dist/chunk-L4DS3EXI.mjs +0 -133
- package/dist/chunk-YWY3D4J7.js +0 -1082
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Props 转 State (useToState)
|
|
2
|
+
|
|
3
|
+
将 props 中的属性转换为响应式 state,支持 v-model 双向绑定。当 props 变化时自动更新 state,当 state 变化时自动触发 emit 更新父组件。
|
|
4
|
+
|
|
5
|
+
**关键词**: useToState, props, state, v-model, 双向绑定, 响应式
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useToState } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| props | `P extends object` | 是 | 组件的 props 对象(通过 defineProps 获取) |
|
|
16
|
+
| key | `keyof P` | 是 | 要监听的 prop 名称(字符串) |
|
|
17
|
+
| emit | `Emits<K & string, P[K]>` | 是 | 组件的 emit 函数(通过 defineEmits 获取),需要包含 update:key 事件 |
|
|
18
|
+
| defaults | `NonNullable<P[K]>` | 否 | 默认值。如果提供,返回的 Ref 将保证不为 undefined |
|
|
19
|
+
|
|
20
|
+
## 重载签名 (Overloads)
|
|
21
|
+
### `useToState<P, K>(props: P, key: K, emit: Emits): Ref<P[K]>`
|
|
22
|
+
基础用法,返回可能为 undefined 的响应式值
|
|
23
|
+
|
|
24
|
+
### `useToState<P, K>(props: P, key: K, emit: Emits, defaults: NonNullable<P[K]>): Ref<NonNullable<P[K]>>`
|
|
25
|
+
带默认值用法,返回保证非 undefined 的响应式值
|
|
26
|
+
|
|
27
|
+
## 返回值
|
|
28
|
+
```typescript
|
|
29
|
+
Ref<P[K]>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
33
|
+
### 忘记传递 emit 参数
|
|
34
|
+
> **错误用法**: `const value = useToState(props, 'modelValue');`
|
|
35
|
+
> **正确写法**: `const value = useToState(props, 'modelValue', emit);`
|
|
36
|
+
> **说明**: useToState 需要 emit 函数来实现双向绑定,缺少 emit 会导致编译错误
|
|
37
|
+
|
|
38
|
+
### emit 没有定义对应的 update:key 事件
|
|
39
|
+
> **错误用法**: `const emit = defineEmits(['change']);
|
|
40
|
+
const value = useToState(props, 'modelValue', emit);`
|
|
41
|
+
> **正确写法**: `const emit = defineEmits(['update:modelValue']);
|
|
42
|
+
const value = useToState(props, 'modelValue', emit);`
|
|
43
|
+
> **说明**: useToState 内部会调用 emit('update:key', newValue),必须在 defineEmits 中声明对应事件
|
|
44
|
+
|
|
45
|
+
### key 参数不是 props 中定义的属性
|
|
46
|
+
> **错误用法**: `const props = defineProps<{ name: string }>();
|
|
47
|
+
const value = useToState(props, 'age', emit);`
|
|
48
|
+
> **正确写法**: `const props = defineProps<{ name: string; age?: number }>();
|
|
49
|
+
const value = useToState(props, 'age', emit);`
|
|
50
|
+
> **说明**: key 必须是 props 中已定义的属性名
|
|
51
|
+
|
|
52
|
+
## 使用示例
|
|
53
|
+
### 基础用法
|
|
54
|
+
将 modelValue prop 转换为响应式 state
|
|
55
|
+
|
|
56
|
+
```vue
|
|
57
|
+
<script setup lang="ts">
|
|
58
|
+
import { useToState } from '@ksyun-internal/versatile';
|
|
59
|
+
|
|
60
|
+
type Props = { modelValue?: string };
|
|
61
|
+
type Emits = { (e: 'update:modelValue', v?: string): void };
|
|
62
|
+
|
|
63
|
+
const props = defineProps<Props>();
|
|
64
|
+
const emit = defineEmits<Emits>();
|
|
65
|
+
|
|
66
|
+
const value = useToState(props, 'modelValue', emit);
|
|
67
|
+
</script>
|
|
68
|
+
<template>
|
|
69
|
+
<input v-model="value" />
|
|
70
|
+
</template>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 带默认值用法
|
|
74
|
+
提供默认值,确保返回值不为 undefined
|
|
75
|
+
|
|
76
|
+
```vue
|
|
77
|
+
<script setup lang="ts">
|
|
78
|
+
import { useToState } from '@ksyun-internal/versatile';
|
|
79
|
+
|
|
80
|
+
const props = defineProps<{ count?: number }>();
|
|
81
|
+
const emit = defineEmits(['update:count']);
|
|
82
|
+
|
|
83
|
+
// 默认值为 0,count 永远不为 undefined
|
|
84
|
+
const count = useToState(props, 'count', emit, 0);
|
|
85
|
+
</script>
|
|
86
|
+
<template>
|
|
87
|
+
<div>{{ count }}</div>
|
|
88
|
+
</template>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 对象类型值
|
|
92
|
+
将对象类型的 prop 转换为响应式 state
|
|
93
|
+
|
|
94
|
+
```vue
|
|
95
|
+
<script setup lang="ts">
|
|
96
|
+
import { useToState } from '@ksyun-internal/versatile';
|
|
97
|
+
|
|
98
|
+
type FormData = { name: string; age: number };
|
|
99
|
+
type Props = { modelValue?: FormData };
|
|
100
|
+
type Emits = { (e: 'update:modelValue', v?: FormData): void };
|
|
101
|
+
|
|
102
|
+
const props = defineProps<Props>();
|
|
103
|
+
const emit = defineEmits<Emits>();
|
|
104
|
+
|
|
105
|
+
const formData = useToState(props, 'modelValue', emit, { name: '', age: 0 });
|
|
106
|
+
</script>
|
|
107
|
+
<template>
|
|
108
|
+
<input v-model="formData.name" />
|
|
109
|
+
<input v-model.number="formData.age" />
|
|
110
|
+
</template>
|
|
111
|
+
```
|
|
112
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 当前用户信息 (useUser)
|
|
2
|
+
|
|
3
|
+
获取当前登录用户信息,适合在业务组件中读取 root 权限、当前用户 ID 或账号属性。
|
|
4
|
+
|
|
5
|
+
**关键词**: useUser, 当前用户, 权限, isRoot, curUserId, 账号信息
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useUser } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 返回值
|
|
13
|
+
```typescript
|
|
14
|
+
Ref<UserInfo | undefined>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
18
|
+
### 直接访问 user.value 的属性,没有处理未加载完成的情况
|
|
19
|
+
> **错误用法**: `const isRoot = user.value.isRoot;`
|
|
20
|
+
> **正确写法**: `const isRoot = user.value?.isRoot;`
|
|
21
|
+
> **说明**: 返回值是 Ref<UserInfo | undefined>,初始化阶段可能为空。
|
|
22
|
+
|
|
23
|
+
## 使用示例
|
|
24
|
+
### 读取当前用户信息
|
|
25
|
+
在页面初始化时获取当前用户及权限信息
|
|
26
|
+
|
|
27
|
+
```vue
|
|
28
|
+
<script setup lang="ts">
|
|
29
|
+
import { useUser } from '@ksyun-internal/versatile';
|
|
30
|
+
|
|
31
|
+
const user = useUser();
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<template>
|
|
35
|
+
<div v-if="user">{{ user.curUserId }}</div>
|
|
36
|
+
</template>
|
|
37
|
+
```
|
|
38
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 表单校验管理 (useValidForm)
|
|
2
|
+
|
|
3
|
+
封装 Form 实例的校验、重置和滚动定位能力,适合页面表单和弹窗表单统一管理。
|
|
4
|
+
|
|
5
|
+
**关键词**: useValidForm, 表单校验, Form, validateByScroll, reset, 滚动定位
|
|
6
|
+
|
|
7
|
+
## 导入语句
|
|
8
|
+
```typescript
|
|
9
|
+
import { useValidForm } from '@ksyun-internal/versatile';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 参数 (Params)
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| models | `Ref<T>` | 否 | 表单模型对象,可在 reset 时恢复默认值 |
|
|
16
|
+
|
|
17
|
+
## 返回值
|
|
18
|
+
```typescript
|
|
19
|
+
{ formRef: Ref<Form | undefined>; validate: Function; validateByScroll: Function; reset: Function; scrollIntoFirstInvalidFormItem: Function; }
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 常见错误与正确用法 (Anti-Hallucination)
|
|
23
|
+
### 希望 reset 恢复初始模型,但没有把 models 传给 hook
|
|
24
|
+
> **错误用法**: `const { reset } = useValidForm();`
|
|
25
|
+
> **正确写法**: `const { reset } = useValidForm(models);`
|
|
26
|
+
> **说明**: 如果需要重置业务表单值,建议把模型 Ref 传入 useValidForm。
|
|
27
|
+
|
|
28
|
+
## 使用示例
|
|
29
|
+
### 页面表单校验
|
|
30
|
+
在提交前统一校验并定位第一个错误项
|
|
31
|
+
|
|
32
|
+
```vue
|
|
33
|
+
<script setup lang="ts">
|
|
34
|
+
import { ref } from 'vue';
|
|
35
|
+
import { useValidForm } from '@ksyun-internal/versatile';
|
|
36
|
+
|
|
37
|
+
const models = ref({ name: '', region: '' });
|
|
38
|
+
const { formRef, validateByScroll } = useValidForm(models);
|
|
39
|
+
</script>
|
|
40
|
+
```
|
|
41
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# 业务弹窗 (VDialog)
|
|
2
|
+
|
|
3
|
+
在基础 Dialog 之上补充默认触发器、受控显隐和异步确认逻辑的业务弹窗组件,适合表单弹窗和危险操作确认。
|
|
4
|
+
|
|
5
|
+
**关键词**: vdialog, dialog, 业务弹窗, 确认弹窗, 表单弹窗, trigger dialog
|
|
6
|
+
|
|
7
|
+
**使用场景**: 表单弹窗、异步确认弹窗、通过按钮触发的操作弹窗
|
|
8
|
+
|
|
9
|
+
## 导入语句
|
|
10
|
+
```typescript
|
|
11
|
+
import { VDialog } from '@ksyun-internal/versatile';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 属性 (Props)
|
|
15
|
+
| 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
|
|
16
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
17
|
+
| title | `string` | `""` | 否 | 弹窗标题 | - | - |
|
|
18
|
+
| size | `string` | `undefined` | 否 | 弹窗尺寸 | - | - |
|
|
19
|
+
| width | `string | number` | `undefined` | 否 | 弹窗宽度 | - | - |
|
|
20
|
+
| loading | `boolean` | `false` | 否 | 确认按钮加载状态 | - | - |
|
|
21
|
+
| disabledOk | `boolean` | `false` | 否 | 是否禁用确认按钮 | - | - |
|
|
22
|
+
| okText | `string` | `"确定"` | 否 | 确认按钮文案 | - | - |
|
|
23
|
+
| cancelText | `string` | `"取消"` | 否 | 取消按钮文案 | - | - |
|
|
24
|
+
| ok | `() => Promise<boolean | void> | boolean | void` | `undefined` | 否 | 确认时的异步处理函数,可返回 false 阻止关闭 | - | - |
|
|
25
|
+
| cancel | `() => void` | `undefined` | 否 | 取消时的回调逻辑 | - | - |
|
|
26
|
+
| container | `string | Function` | `undefined` | 否 | 指定弹窗挂载容器 | - | - |
|
|
27
|
+
| overlay | `boolean` | `true` | 否 | 是否显示遮罩层 | - | - |
|
|
28
|
+
| closable | `boolean` | `true` | 否 | 点击遮罩层是否可关闭 | - | - |
|
|
29
|
+
| terminate | `() => void` | `undefined` | 否 | 关闭动作统一回调 | - | - |
|
|
30
|
+
| escClosable | `boolean` | `true` | 否 | 是否允许 ESC 关闭 | - | - |
|
|
31
|
+
| hideClose | `boolean` | `false` | 否 | 是否隐藏右上角关闭按钮 | - | - |
|
|
32
|
+
| draggable | `boolean` | `false` | 否 | 是否允许拖拽弹窗 | - | - |
|
|
33
|
+
| mode | `string` | `undefined` | 否 | 弹窗展示模式 | - | - |
|
|
34
|
+
| hideTrigger | `boolean` | `false` | 否 | 隐藏默认 trigger,作为受控弹窗使用 | - | - |
|
|
35
|
+
| modelValue | `boolean | undefined` | `undefined` | 否 | 弹窗显示状态 | - | - |
|
|
36
|
+
| btnProps | `ButtonProps` | `undefined` | 否 | 默认 trigger 按钮属性 | - | - |
|
|
37
|
+
| btnText | `string` | `"打开对话框"` | 否 | 默认 trigger 按钮文案 | - | - |
|
|
38
|
+
|
|
39
|
+
## 事件 (Events)
|
|
40
|
+
| 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
|
|
41
|
+
| --- | --- | --- | --- | --- |
|
|
42
|
+
| open | `@open` | 弹窗打开后触发 | `-` | `<Dialog v-model="visible" @open="handleOpen">` |
|
|
43
|
+
| close | `@close` | 弹窗关闭后触发,不管是什么原因导致的关闭 | `-` | `<Dialog v-model="visible" @close="handleClose">` |
|
|
44
|
+
| ok | `@ok` | 点击确定按钮时触发 | `-` | `<Dialog v-model="visible" @ok="handleOk">` |
|
|
45
|
+
| cancel | `@cancel` | 点击取消按钮时触发 | `-` | `<Dialog v-model="visible" @cancel="handleCancel">` |
|
|
46
|
+
| terminate | `@terminate` | 用户强行关闭弹窗时触发:点击关闭按钮、点击遮罩层、按ESC键 | `-` | `<Dialog v-model="visible" @terminate="handleTerminate">` |
|
|
47
|
+
| afterClose | `@after-close` | 弹窗退出动画执行完成后触发 | `-` | `<Dialog v-model="visible" @after-close="handleAfterClose">` |
|
|
48
|
+
|
|
49
|
+
## 插槽 (Slots)
|
|
50
|
+
| 插槽名 | 说明 | 模板写法 | 示例 |
|
|
51
|
+
| --- | --- | --- | --- |
|
|
52
|
+
| default | 弹窗主体内容(body区域) | `默认插槽` | `<Dialog v-model="visible">
|
|
53
|
+
<p>弹窗内容</p>
|
|
54
|
+
</Dialog>` |
|
|
55
|
+
| header | 扩展弹窗头部 | `#header` | `<Dialog v-model="visible">
|
|
56
|
+
<template #header>
|
|
57
|
+
<h2>自定义头部</h2>
|
|
58
|
+
</template>
|
|
59
|
+
</Dialog>` |
|
|
60
|
+
| footer | 扩展弹窗底部按钮区域 | `#footer` | `<Dialog v-model="visible">
|
|
61
|
+
<template #footer>
|
|
62
|
+
<Button @click="visible = false">关闭</Button>
|
|
63
|
+
<Button type="primary" @click="handleSubmit">提交</Button>
|
|
64
|
+
</template>
|
|
65
|
+
</Dialog>` |
|
|
66
|
+
| content | 定义整个弹窗体,包括header、body、footer | `#content` | `<Dialog v-model="visible">
|
|
67
|
+
<template #content>
|
|
68
|
+
<!-- 完全自定义弹窗结构 -->
|
|
69
|
+
</template>
|
|
70
|
+
</Dialog>` |
|
|
71
|
+
| trigger | 自定义触发按钮或触发区域 | `<template #trigger>...</template>` | - |
|
|
72
|
+
|
|
73
|
+
## 使用示例
|
|
74
|
+
### 受控表单弹窗
|
|
75
|
+
**场景**: 在页面中以受控方式打开一个承载业务表单的弹窗。
|
|
76
|
+
|
|
77
|
+
通过 v-model 控制弹窗显隐,并在确认时执行异步逻辑。
|
|
78
|
+
|
|
79
|
+
**使用的 API**: 属性: modelValue, title, ok, hideTrigger
|
|
80
|
+
|
|
81
|
+
```vue
|
|
82
|
+
<script setup lang="ts">
|
|
83
|
+
import { ref } from 'vue';
|
|
84
|
+
import { VDialog, FormItemInput } from '@ksyun-internal/versatile';
|
|
85
|
+
|
|
86
|
+
const visible = ref(false);
|
|
87
|
+
const name = ref('');
|
|
88
|
+
const handleOk = async () => {
|
|
89
|
+
console.log('submit', name.value);
|
|
90
|
+
};
|
|
91
|
+
</script>
|
|
92
|
+
|
|
93
|
+
<template>
|
|
94
|
+
<button @click="visible = true">新建实例</button>
|
|
95
|
+
<VDialog v-model="visible" title="新建实例" :ok="handleOk" :hide-trigger="true">
|
|
96
|
+
<FormItemInput v-model="name" label="实例名称" placeholder="请输入实例名称" />
|
|
97
|
+
</VDialog>
|
|
98
|
+
</template>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 使用 trigger 插槽触发确认弹窗
|
|
102
|
+
**场景**: 在操作列或详情页中用自定义按钮触发危险操作确认弹窗。
|
|
103
|
+
|
|
104
|
+
通过 trigger 插槽自定义入口,用于危险操作前的二次确认。
|
|
105
|
+
|
|
106
|
+
**使用的 API**: 属性: title, okText, ok
|
|
107
|
+
|
|
108
|
+
```vue
|
|
109
|
+
<script setup lang="ts">
|
|
110
|
+
import { VDialog } from '@ksyun-internal/versatile';
|
|
111
|
+
|
|
112
|
+
const handleOk = async () => {
|
|
113
|
+
console.log('release instance');
|
|
114
|
+
};
|
|
115
|
+
</script>
|
|
116
|
+
|
|
117
|
+
<template>
|
|
118
|
+
<VDialog title="释放实例" ok-text="确认释放" :ok="handleOk">
|
|
119
|
+
<template #trigger>
|
|
120
|
+
<button>释放实例</button>
|
|
121
|
+
</template>
|
|
122
|
+
<div>释放后实例数据将被删除,且不可恢复。</div>
|
|
123
|
+
</VDialog>
|
|
124
|
+
</template>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 相关组件
|
|
128
|
+
Dialog, VDrawer, useDialog
|
|
129
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 业务抽屉 (VDrawer)
|
|
2
|
+
|
|
3
|
+
在基础 Drawer 之上补充默认触发器、受控显隐和异步确认逻辑的业务抽屉组件,适合编辑长表单和查看侧边详情。
|
|
4
|
+
|
|
5
|
+
**关键词**: vdrawer, drawer, 业务抽屉, 侧边抽屉, 编辑抽屉, slot drawer
|
|
6
|
+
|
|
7
|
+
**使用场景**: 侧边表单编辑、详情信息展示、通过按钮触发的抽屉
|
|
8
|
+
|
|
9
|
+
## 导入语句
|
|
10
|
+
```typescript
|
|
11
|
+
import { VDrawer } from '@ksyun-internal/versatile';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 属性 (Props)
|
|
15
|
+
| 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
|
|
16
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
17
|
+
| title | `string` | `""` | 否 | 抽屉标题 | - | - |
|
|
18
|
+
| placement | `"left" | "right" | "top" | "bottom"` | `"right"` | 否 | 抽屉弹出方向 | - | - |
|
|
19
|
+
| size | `string` | `undefined` | 否 | 抽屉尺寸 | - | - |
|
|
20
|
+
| width | `string | number` | `undefined` | 否 | 抽屉宽度 | - | - |
|
|
21
|
+
| loading | `boolean` | `false` | 否 | 确认按钮加载状态 | - | - |
|
|
22
|
+
| disabledOk | `boolean` | `false` | 否 | 是否禁用确认按钮 | - | - |
|
|
23
|
+
| okText | `string` | `"确定"` | 否 | 确认按钮文案 | - | - |
|
|
24
|
+
| cancelText | `string` | `"取消"` | 否 | 取消按钮文案 | - | - |
|
|
25
|
+
| ok | `() => Promise<boolean | void> | boolean | void` | `undefined` | 否 | 确认时的异步处理函数,可返回 false 阻止关闭 | - | - |
|
|
26
|
+
| cancel | `() => void` | `undefined` | 否 | 取消时的回调逻辑 | - | - |
|
|
27
|
+
| hideClose | `boolean` | `false` | 否 | 是否隐藏右上角关闭按钮 | - | - |
|
|
28
|
+
| overlay | `boolean` | `true` | 否 | 是否显示遮罩层 | - | - |
|
|
29
|
+
| closable | `boolean` | `true` | 否 | 点击遮罩层是否可关闭 | - | - |
|
|
30
|
+
| escClosable | `boolean` | `true` | 否 | 是否允许 ESC 关闭 | - | - |
|
|
31
|
+
| draggable | `boolean` | `false` | 否 | 是否允许拖拽抽屉 | - | - |
|
|
32
|
+
| terminate | `() => void` | `undefined` | 否 | 关闭动作统一回调 | - | - |
|
|
33
|
+
| container | `string | Function` | `undefined` | 否 | 指定抽屉挂载容器 | - | - |
|
|
34
|
+
| mode | `string` | `undefined` | 否 | 抽屉展示模式 | - | - |
|
|
35
|
+
| hideTrigger | `boolean` | `false` | 否 | 隐藏默认 trigger,作为受控抽屉使用 | - | - |
|
|
36
|
+
| modelValue | `boolean | undefined` | `undefined` | 否 | 抽屉显示状态 | - | - |
|
|
37
|
+
| btnProps | `ButtonProps` | `undefined` | 否 | 默认 trigger 按钮属性 | - | - |
|
|
38
|
+
| btnText | `string` | `"打开抽屉"` | 否 | 默认 trigger 按钮文案 | - | - |
|
|
39
|
+
|
|
40
|
+
## 事件 (Events)
|
|
41
|
+
| 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
|
|
42
|
+
| --- | --- | --- | --- | --- |
|
|
43
|
+
| open | `@open` | 抽屉打开后触发 | `-` | `<Drawer @open="handleOpen">` |
|
|
44
|
+
| close | `@close` | 抽屉关闭后触发,不管是什么原因导致的关闭 | `-` | `<Drawer @close="handleClose">` |
|
|
45
|
+
| ok | `@ok` | 点击确定按钮时触发 | `-` | `<Drawer @ok="handleOk">` |
|
|
46
|
+
| cancel | `@cancel` | 点击取消按钮时触发 | `-` | `<Drawer @cancel="handleCancel">` |
|
|
47
|
+
| terminate | `@terminate` | 用户强行关闭抽屉时触发(点击关闭按钮、遮罩层或按 ESC) | `-` | `<Drawer @terminate="handleTerminate">` |
|
|
48
|
+
| afterClose | `@afterClose` | 抽屉退出动画执行完成后触发 | `-` | `<Drawer @afterClose="handleAfterClose">` |
|
|
49
|
+
|
|
50
|
+
## 插槽 (Slots)
|
|
51
|
+
| 插槽名 | 说明 | 模板写法 | 示例 |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| default | 抽屉主体内容区域 | `<VDrawer>...</VDrawer>` | - |
|
|
54
|
+
| header | 自定义抽屉头部 | `<template #header>...</template>` | - |
|
|
55
|
+
| footer | 自定义抽屉底部操作区 | `<template #footer>...</template>` | - |
|
|
56
|
+
| trigger | 自定义触发按钮或触发区域 | `<template #trigger>...</template>` | - |
|
|
57
|
+
|
|
58
|
+
## 使用示例
|
|
59
|
+
### 侧边编辑抽屉
|
|
60
|
+
**场景**: 在列表页右侧滑出编辑面板,保留用户当前上下文。
|
|
61
|
+
|
|
62
|
+
用抽屉承载较长的编辑表单,避免打断列表上下文。
|
|
63
|
+
|
|
64
|
+
**使用的 API**: 属性: modelValue, title, ok, hideTrigger
|
|
65
|
+
|
|
66
|
+
```vue
|
|
67
|
+
<script setup lang="ts">
|
|
68
|
+
import { ref } from 'vue';
|
|
69
|
+
import { VDrawer, FormItemInput, Description } from '@ksyun-internal/versatile';
|
|
70
|
+
|
|
71
|
+
const visible = ref(false);
|
|
72
|
+
const name = ref('web-prod-01');
|
|
73
|
+
const remark = ref('支付链路核心实例');
|
|
74
|
+
const handleOk = async () => {
|
|
75
|
+
console.log('save', name.value, remark.value);
|
|
76
|
+
};
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<template>
|
|
80
|
+
<button @click="visible = true">编辑实例</button>
|
|
81
|
+
<VDrawer v-model="visible" title="编辑实例" :ok="handleOk" :hide-trigger="true">
|
|
82
|
+
<FormItemInput v-model="name" label="实例名称" />
|
|
83
|
+
<Description v-model="remark" />
|
|
84
|
+
</VDrawer>
|
|
85
|
+
</template>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 使用 trigger 和 footer 插槽自定义抽屉
|
|
89
|
+
**场景**: 在详情预览场景下通过自定义触发器和底部按钮扩展抽屉交互。
|
|
90
|
+
|
|
91
|
+
通过 trigger 和 footer 插槽自定义抽屉打开方式和底部操作区。
|
|
92
|
+
|
|
93
|
+
**使用的 API**: 属性: modelValue, title, hideTrigger
|
|
94
|
+
|
|
95
|
+
```vue
|
|
96
|
+
<script setup lang="ts">
|
|
97
|
+
import { ref } from 'vue';
|
|
98
|
+
import { VDrawer } from '@ksyun-internal/versatile';
|
|
99
|
+
|
|
100
|
+
const visible = ref(false);
|
|
101
|
+
</script>
|
|
102
|
+
|
|
103
|
+
<template>
|
|
104
|
+
<VDrawer v-model="visible" title="实例详情" :hide-trigger="false">
|
|
105
|
+
<template #trigger>
|
|
106
|
+
<button>查看详情</button>
|
|
107
|
+
</template>
|
|
108
|
+
<div>这里可以放详情摘要、监控图表或操作记录。</div>
|
|
109
|
+
<template #footer>
|
|
110
|
+
<button @click="visible = false">关闭</button>
|
|
111
|
+
<button>导出详情</button>
|
|
112
|
+
</template>
|
|
113
|
+
</VDrawer>
|
|
114
|
+
</template>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## 相关组件
|
|
118
|
+
Drawer, VDialog
|
|
119
|
+
|
|
@@ -12,9 +12,9 @@ import { VirtualList } from '@king-design/vue';
|
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
## 属性 (Props)
|
|
15
|
-
| 属性名 | 类型 | 默认值 | 必填 | 说明 | 示例 |
|
|
16
|
-
| --- | --- | --- | --- | --- | --- |
|
|
17
|
-
| disabled | `boolean` | `false` | 否 | 是否禁用虚拟化,禁用后会渲染所有元素 | `<VirtualList disabled></VirtualList>` |
|
|
15
|
+
| 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
|
|
16
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
17
|
+
| disabled | `boolean` | `false` | 否 | 是否禁用虚拟化,禁用后会渲染所有元素 | - | `<VirtualList disabled></VirtualList>` |
|
|
18
18
|
|
|
19
19
|
## 子组件 (Sub-Components)
|
|
20
20
|
### VirtualListContainer
|
|
@@ -34,6 +34,7 @@ import { VirtualList } from '@king-design/vue';
|
|
|
34
34
|
行渲染组件,包裹实际渲染的列表项
|
|
35
35
|
|
|
36
36
|
## 常见错误与正确用法 (Anti-Hallucination)
|
|
37
|
+
### 容器未设置高度
|
|
37
38
|
> **错误用法**: `<VirtualList> <!-- 没有高度,无法滚动 -->
|
|
38
39
|
<div v-for="item in data" :key="item.value">...</div>
|
|
39
40
|
</VirtualList>`
|
|
@@ -42,10 +43,12 @@ import { VirtualList } from '@king-design/vue';
|
|
|
42
43
|
</VirtualList>`
|
|
43
44
|
> **说明**: VirtualList 容器必须设置固定高度才能正常工作
|
|
44
45
|
|
|
46
|
+
### 列表项缺少 key
|
|
45
47
|
> **错误用法**: `<div v-for="item in data">{{ item.label }}</div>`
|
|
46
48
|
> **正确写法**: `<div v-for="item in data" :key="item.value">{{ item.label }}</div>`
|
|
47
49
|
> **说明**: 每个列表项必须设置唯一的 key 以确保正确渲染
|
|
48
50
|
|
|
51
|
+
### 数据量较小时启用虚拟化
|
|
49
52
|
> **错误用法**: `const data = [1, 2, 3]; // 只有 3 条数据
|
|
50
53
|
<VirtualList>...</VirtualList>`
|
|
51
54
|
> **正确写法**: `const data = [1, 2, 3];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "useCRUD",
|
|
3
|
+
"name": "useCRUD",
|
|
4
|
+
"displayName": "增删行状态管理",
|
|
5
|
+
"category": "form",
|
|
6
|
+
"description": "管理数组型表单项的新增与删除能力,并根据最大最小数量约束生成可直接用于按钮禁用态的结果。",
|
|
7
|
+
"importStatement": "import { useCRUD } from '@ksyun-internal/versatile';",
|
|
8
|
+
"source": "@ksyun-internal/versatile",
|
|
9
|
+
"params": [
|
|
10
|
+
{
|
|
11
|
+
"name": "models",
|
|
12
|
+
"type": "Ref<T[]>",
|
|
13
|
+
"required": true,
|
|
14
|
+
"description": "当前表单项数组"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "initItem",
|
|
18
|
+
"type": "() => T",
|
|
19
|
+
"required": true,
|
|
20
|
+
"description": "新增项的初始化工厂函数"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "maxInstanceNum",
|
|
24
|
+
"type": "number",
|
|
25
|
+
"required": false,
|
|
26
|
+
"description": "最大可新增数量"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "minInstanceNum",
|
|
30
|
+
"type": "number",
|
|
31
|
+
"required": false,
|
|
32
|
+
"description": "最小保留数量"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"returnType": "{ canAdd: ComputedRef<{ disabled: boolean; msg: string }>; canDelete: ComputedRef<{ disabled: boolean; msg: string }>; addItem: () => void; deleteItem: (index: number) => void; }",
|
|
36
|
+
"examples": [
|
|
37
|
+
{
|
|
38
|
+
"id": "dynamic_form_rows",
|
|
39
|
+
"title": "动态表单行增删",
|
|
40
|
+
"description": "控制实例配置行的新增与删除",
|
|
41
|
+
"code": "<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { useCRUD } from '@ksyun-internal/versatile';\n\nconst models = ref([{ name: '', value: '' }]);\nconst { canAdd, canDelete, addItem, deleteItem } = useCRUD(\n models,\n () => ({ name: '', value: '' }),\n 5,\n 1\n);\n</script>"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"commonMistakes": [
|
|
45
|
+
{
|
|
46
|
+
"id": "shared_default_object",
|
|
47
|
+
"description": "直接复用同一个默认对象,导致新增项互相串值",
|
|
48
|
+
"wrongCode": "const defaultItem = { name: '', value: '' }; useCRUD(models, () => defaultItem);",
|
|
49
|
+
"correctCode": "useCRUD(models, () => ({ name: '', value: '' }));",
|
|
50
|
+
"explanation": "initItem 应返回新的对象实例,避免多个表单项共享引用。"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"searchKeywords": [
|
|
54
|
+
"useCRUD",
|
|
55
|
+
"动态表单",
|
|
56
|
+
"新增 删除",
|
|
57
|
+
"数组项",
|
|
58
|
+
"canAdd",
|
|
59
|
+
"canDelete"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "useCountdown",
|
|
3
|
+
"name": "useCountdown",
|
|
4
|
+
"displayName": "倒计时",
|
|
5
|
+
"category": "timer",
|
|
6
|
+
"description": "管理秒级或自定义间隔的倒计时流程,提供 start、reset、stop 和 pause/resume 等控制能力。",
|
|
7
|
+
"importStatement": "import { useCountdown } from '@ksyun-internal/versatile';",
|
|
8
|
+
"source": "@ksyun-internal/versatile",
|
|
9
|
+
"params": [
|
|
10
|
+
{
|
|
11
|
+
"name": "initialCountdown",
|
|
12
|
+
"type": "MaybeRefOrGetter<number>",
|
|
13
|
+
"required": true,
|
|
14
|
+
"description": "初始倒计时值"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "options",
|
|
18
|
+
"type": "UseCountdownOptions",
|
|
19
|
+
"required": false,
|
|
20
|
+
"description": "倒计时配置,可设置 interval、immediate、onTick 和 onComplete"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"returnType": "{ remaining: ShallowRef<number>; isActive: Readonly<ShallowRef<boolean>>; pause: () => void; resume: () => void; reset: (countdown?: MaybeRefOrGetter<number>) => void; stop: () => void; start: (countdown?: MaybeRefOrGetter<number>) => void; }",
|
|
24
|
+
"examples": [
|
|
25
|
+
{
|
|
26
|
+
"id": "sms_countdown",
|
|
27
|
+
"title": "短信验证码倒计时",
|
|
28
|
+
"description": "点击发送验证码后开始倒计时",
|
|
29
|
+
"code": "<script setup lang=\"ts\">\nimport { useCountdown } from '@ksyun-internal/versatile';\n\nconst { remaining, start, stop } = useCountdown(60, {\n immediate: false,\n onComplete: () => console.log('倒计时结束'),\n});\n</script>"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"commonMistakes": [
|
|
33
|
+
{
|
|
34
|
+
"id": "expect_resume_reset",
|
|
35
|
+
"description": "把 resume 当作重新开始倒计时使用",
|
|
36
|
+
"wrongCode": "resume();",
|
|
37
|
+
"correctCode": "start(); // 或 reset(60) 后再 start()",
|
|
38
|
+
"explanation": "resume 只用于恢复暂停中的倒计时,不会重置剩余时间。"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"searchKeywords": [
|
|
42
|
+
"useCountdown",
|
|
43
|
+
"倒计时",
|
|
44
|
+
"remaining",
|
|
45
|
+
"短信验证码",
|
|
46
|
+
"start stop",
|
|
47
|
+
"pause resume"
|
|
48
|
+
]
|
|
49
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "useDetail",
|
|
3
|
+
"name": "useDetail",
|
|
4
|
+
"displayName": "详情页状态守卫",
|
|
5
|
+
"category": "page",
|
|
6
|
+
"description": "围绕详情页数据、网络状态和路由跳转封装守卫逻辑,适合详情页数据为空、请求异常或需要回退列表页的场景。",
|
|
7
|
+
"importStatement": "import { useDetail } from '@ksyun-internal/versatile';",
|
|
8
|
+
"source": "@ksyun-internal/versatile",
|
|
9
|
+
"params": [
|
|
10
|
+
{
|
|
11
|
+
"name": "detailData",
|
|
12
|
+
"type": "Ref<T | null | undefined>",
|
|
13
|
+
"required": true,
|
|
14
|
+
"description": "详情数据响应式对象"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "networkStatus",
|
|
18
|
+
"type": "Ref<number | undefined>",
|
|
19
|
+
"required": true,
|
|
20
|
+
"description": "网络状态响应式值"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "routerName",
|
|
24
|
+
"type": "string | RouteLocationAsRelativeGeneric | RouteLocationAsPathGeneric",
|
|
25
|
+
"required": false,
|
|
26
|
+
"description": "异常时回退的路由信息"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "refetch",
|
|
30
|
+
"type": "() => void",
|
|
31
|
+
"required": false,
|
|
32
|
+
"description": "重新拉取详情数据的方法"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "tip",
|
|
36
|
+
"type": "string",
|
|
37
|
+
"required": false,
|
|
38
|
+
"description": "详情不存在或异常时展示的提示文案"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"returnType": "void",
|
|
42
|
+
"examples": [
|
|
43
|
+
{
|
|
44
|
+
"id": "detail_guard",
|
|
45
|
+
"title": "详情页请求守卫",
|
|
46
|
+
"description": "在详情页请求为空或异常时统一处理跳转和重试",
|
|
47
|
+
"code": "<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { useDetail } from '@ksyun-internal/versatile';\n\nconst detailData = ref();\nconst networkStatus = ref(7);\nconst refetch = () => console.log('retry');\n\nuseDetail(detailData, networkStatus, { name: 'instance-list' }, refetch, '实例不存在');\n</script>"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"commonMistakes": [
|
|
51
|
+
{
|
|
52
|
+
"id": "missing_network_status",
|
|
53
|
+
"description": "只传详情数据,没有把网络状态传给 hook,导致无法区分加载中和异常态",
|
|
54
|
+
"wrongCode": "useDetail(detailData);",
|
|
55
|
+
"correctCode": "useDetail(detailData, networkStatus, 'instance-list');",
|
|
56
|
+
"explanation": "networkStatus 是 hook 判断详情状态的重要输入。"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"searchKeywords": [
|
|
60
|
+
"useDetail",
|
|
61
|
+
"详情页",
|
|
62
|
+
"networkStatus",
|
|
63
|
+
"详情守卫",
|
|
64
|
+
"异常跳转",
|
|
65
|
+
"refetch"
|
|
66
|
+
]
|
|
67
|
+
}
|