@done-coding/admin-core 0.18.0 → 0.19.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/README.md +77 -1
- package/es/_virtual/_plugin-vue_export-helper.mjs +7 -6
- package/es/bridge/config-hook.mjs +49 -37
- package/es/bridge/index.mjs +152 -109
- package/es/bridge/layout.mjs +45 -31
- package/es/bridge/plugin.mjs +22 -12
- package/es/bridge/route.mjs +59 -50
- package/es/bridge/state.mjs +54 -39
- package/es/bridge/storage.mjs +18 -8
- package/es/bridge/theme/index.mjs +200 -97
- package/es/bridge/theme/persist.mjs +11 -7
- package/es/bridge/theme/system-dark.mjs +13 -6
- package/es/components/app-layout/AppAside.vue.mjs +4 -4
- package/es/components/app-layout/AppAside.vue2.mjs +37 -30
- package/es/components/app-layout/AppBody.vue.mjs +4 -4
- package/es/components/app-layout/AppBody.vue2.mjs +97 -60
- package/es/components/app-layout/AppBreadcrumb.vue.mjs +4 -4
- package/es/components/app-layout/AppBreadcrumb.vue2.mjs +59 -38
- package/es/components/app-layout/AppCollapseToggle.vue.mjs +4 -4
- package/es/components/app-layout/AppCollapseToggle.vue2.mjs +51 -42
- package/es/components/app-layout/AppFooter.vue.mjs +4 -4
- package/es/components/app-layout/AppFooter.vue2.mjs +15 -12
- package/es/components/app-layout/AppHeader.vue.mjs +4 -4
- package/es/components/app-layout/AppHeader.vue2.mjs +81 -58
- package/es/components/app-layout/AppLayout.vue.mjs +4 -4
- package/es/components/app-layout/AppLayout.vue2.mjs +148 -112
- package/es/components/app-layout/AppPage.vue.mjs +4 -4
- package/es/components/app-layout/AppPage.vue2.mjs +254 -197
- package/es/components/app-layout/AppShell.vue.mjs +44 -42
- package/es/components/app-layout/AppShell.vue2.mjs +2 -2
- package/es/components/app-layout/AppSidebar.vue.mjs +4 -4
- package/es/components/app-layout/AppSidebar.vue2.mjs +76 -59
- package/es/components/app-layout/AppTheme.vue.mjs +4 -4
- package/es/components/app-layout/AppTheme.vue2.mjs +69 -57
- package/es/components/app-layout/app-page-geometry.mjs +44 -42
- package/es/components/app-layout/keep-alive.mjs +27 -19
- package/es/components/app-layout/viewport.mjs +4 -3
- package/es/components/data-view/DataListView.vue.mjs +4 -4
- package/es/components/data-view/DataListView.vue2.mjs +133 -93
- package/es/components/data-view/DataListViewItem.vue.mjs +4 -4
- package/es/components/data-view/DataListViewItem.vue2.mjs +11 -9
- package/es/components/data-view/utils.mjs +36 -34
- package/es/components/display/ActionBtn.vue.mjs +94 -71
- package/es/components/display/ActionBtn.vue2.mjs +2 -2
- package/es/components/display/ActionBtnGroup.vue.mjs +54 -48
- package/es/components/display/ActionBtnGroup.vue2.mjs +2 -2
- package/es/components/display/ActionConfirm.vue.mjs +4 -4
- package/es/components/display/ActionConfirm.vue2.mjs +116 -92
- package/es/components/display/BooleanTag.vue.mjs +24 -18
- package/es/components/display/BooleanTag.vue2.mjs +2 -2
- package/es/components/display/HeightProvider.vue.mjs +37 -27
- package/es/components/display/HeightProvider.vue2.mjs +2 -2
- package/es/components/display/TabsHeader.vue.mjs +4 -4
- package/es/components/display/TabsHeader.vue2.mjs +86 -57
- package/es/components/display/TabsMain.vue.mjs +156 -125
- package/es/components/display/TabsMain.vue2.mjs +2 -2
- package/es/components/display/TabsNaturalFlow.vue.mjs +15 -11
- package/es/components/display/TabsNaturalFlow.vue2.mjs +2 -2
- package/es/components/display/TabsRefineFlow.vue.mjs +55 -42
- package/es/components/display/TabsRefineFlow.vue2.mjs +2 -2
- package/es/components/display/TabsTile.vue.mjs +4 -4
- package/es/components/display/TabsTile.vue2.mjs +204 -146
- package/es/components/display/WatchSize.vue.mjs +50 -30
- package/es/components/display/WatchSize.vue2.mjs +2 -2
- package/es/components/display/use-tabs-query-sync.mjs +21 -17
- package/es/components/form/FormItem.vue.mjs +4 -4
- package/es/components/form/FormItem.vue2.mjs +183 -121
- package/es/components/form/FormItemNestForm.vue.mjs +4 -4
- package/es/components/form/FormItemNestForm.vue2.mjs +38 -34
- package/es/components/form/FormItemNestFormList.vue.mjs +4 -4
- package/es/components/form/FormItemNestFormList.vue2.mjs +135 -106
- package/es/components/form/FormMain.vue.mjs +4 -4
- package/es/components/form/FormMain.vue2.mjs +226 -139
- package/es/components/form/FormRadioGroup.vue.mjs +67 -52
- package/es/components/form/FormRadioGroup.vue2.mjs +2 -2
- package/es/components/form/FormSearch.vue.mjs +4 -4
- package/es/components/form/FormSearch.vue2.mjs +194 -156
- package/es/components/form/FormSelect.vue.mjs +69 -42
- package/es/components/form/FormSelect.vue2.mjs +2 -2
- package/es/components/form/FormSubmitBtn.vue.mjs +30 -25
- package/es/components/form/FormSubmitBtn.vue2.mjs +2 -2
- package/es/components/form/FormSubmitPanel.vue.mjs +4 -4
- package/es/components/form/FormSubmitPanel.vue2.mjs +129 -96
- package/es/components/form/FormTree.vue.mjs +19 -16
- package/es/components/form/FormTree.vue2.mjs +2 -2
- package/es/components/form/FormVerifyCode.vue.mjs +58 -41
- package/es/components/form/FormVerifyCode.vue2.mjs +2 -2
- package/es/components/form/FormVerifyImage.vue.mjs +4 -4
- package/es/components/form/FormVerifyImage.vue2.mjs +62 -40
- package/es/components/form/form-search-utils.mjs +83 -52
- package/es/components/form/nest-form-item-list.mjs +63 -55
- package/es/components/form/nest-form-item.mjs +30 -30
- package/es/components/form/nest-registry.mjs +4 -4
- package/es/components/form/use-form-submit.mjs +18 -15
- package/es/components/form/use-layout-by-container.mjs +23 -15
- package/es/components/form/use-nest-form-list.mjs +19 -16
- package/es/components/form/use-nest-form.mjs +37 -28
- package/es/components/form/use-nest-layout-scale.mjs +11 -10
- package/es/components/form/utils.mjs +233 -145
- package/es/components/list-page/ListPage.vue.mjs +4 -4
- package/es/components/list-page/ListPage.vue2.mjs +313 -207
- package/es/components/list-page/use-sticky.mjs +45 -33
- package/es/components/menu/MenuItemSub.vue.mjs +47 -43
- package/es/components/menu/MenuItemSub.vue2.mjs +2 -2
- package/es/components/menu/MenuTree.vue.mjs +84 -61
- package/es/components/menu/MenuTree.vue2.mjs +2 -2
- package/es/components/misc/AutoRefresh.vue.mjs +4 -4
- package/es/components/misc/AutoRefresh.vue2.mjs +78 -53
- package/es/components/misc/AutoRefreshGroup.vue.mjs +4 -4
- package/es/components/misc/AutoRefreshGroup.vue2.mjs +54 -51
- package/es/components/misc/SelectModule.vue.mjs +54 -45
- package/es/components/misc/SelectModule.vue2.mjs +2 -2
- package/es/components/misc/TriggerAutoImport.vue.mjs +7 -5
- package/es/components/misc/TriggerAutoImport.vue2.mjs +2 -2
- package/es/components/modal/ModalConfirm.vue.mjs +4 -4
- package/es/components/modal/ModalConfirm.vue2.mjs +160 -125
- package/es/components/modal/ModalDetail.vue.mjs +50 -39
- package/es/components/modal/ModalDetail.vue2.mjs +2 -2
- package/es/components/modal/ModalForm.vue.mjs +63 -52
- package/es/components/modal/ModalForm.vue2.mjs +2 -2
- package/es/components/modal/ModalPorter.vue.mjs +51 -36
- package/es/components/modal/ModalPorter.vue2.mjs +2 -2
- package/es/components/modal/ModalShelf.vue.mjs +38 -28
- package/es/components/modal/ModalShelf.vue2.mjs +2 -2
- package/es/components/modal/modal-shelf-core.mjs +52 -36
- package/es/components/modal/modal-shelf-hierarchy.mjs +11 -9
- package/es/components/panel/PanelEditSwitch.vue.mjs +4 -4
- package/es/components/panel/PanelEditSwitch.vue2.mjs +88 -66
- package/es/components/panel/PanelItem.vue.mjs +4 -4
- package/es/components/panel/PanelItem.vue2.mjs +103 -77
- package/es/components/panel/PanelItemNestForm.vue.mjs +4 -4
- package/es/components/panel/PanelItemNestForm.vue2.mjs +61 -52
- package/es/components/panel/PanelItemNestPanel.vue.mjs +22 -20
- package/es/components/panel/PanelItemNestPanel.vue2.mjs +2 -2
- package/es/components/panel/PanelMain.vue.mjs +4 -4
- package/es/components/panel/PanelMain.vue2.mjs +92 -74
- package/es/components/panel/nest-panel-form.mjs +44 -38
- package/es/components/panel/nest-panel-item.mjs +18 -17
- package/es/components/slot-layout/SlotLayoutFlowAside.vue.mjs +4 -4
- package/es/components/slot-layout/SlotLayoutFlowAside.vue2.mjs +55 -42
- package/es/components/slot-layout/SlotLayoutTemplate.vue.mjs +11 -9
- package/es/components/slot-layout/SlotLayoutTemplate.vue2.mjs +2 -2
- package/es/components/table/TableMain.vue.mjs +4 -4
- package/es/components/table/TableMain.vue2.mjs +378 -275
- package/es/components/table/TableSkeleton.vue.mjs +4 -4
- package/es/components/table/TableSkeleton.vue2.mjs +95 -74
- package/es/components/table/TableToolbar.vue.mjs +4 -4
- package/es/components/table/TableToolbar.vue2.mjs +170 -154
- package/es/components/table/ToolbarButtons.vue.mjs +12 -10
- package/es/components/table/ToolbarButtons.vue2.mjs +2 -2
- package/es/components/table/constants.mjs +4 -3
- package/es/components/table/use-fill-height.mjs +12 -10
- package/es/components/table/use-table-skeleton.mjs +19 -15
- package/es/config/list-model.mjs +2 -2
- package/es/config/route.mjs +4 -3
- package/es/helpers/form.mjs +35 -25
- package/es/helpers/list-helper.mjs +59 -44
- package/es/hooks/activated.mjs +49 -33
- package/es/hooks/feel-size.mjs +39 -23
- package/es/hooks/menus-dispatch.mjs +68 -35
- package/es/hooks/timeout.mjs +29 -14
- package/es/hooks/use-breakpoint.mjs +35 -23
- package/es/hooks/use-channel-viewport-height.mjs +30 -20
- package/es/hooks/use-custom-breakpoint.mjs +48 -31
- package/es/hooks/use-observe-size.mjs +37 -20
- package/es/hooks/use-theme-apply.mjs +175 -124
- package/es/hooks/use-viewport-apply.mjs +39 -27
- package/es/index.mjs +239 -239
- package/es/inject/key.mjs +52 -41
- package/es/injectInfo.json.mjs +2 -2
- package/es/router/group-redirect.mjs +22 -16
- package/es/router/guard/index.mjs +26 -21
- package/es/router/guard/login.mjs +4 -2
- package/es/router/guard/permission.mjs +4 -2
- package/es/store/app.mjs +163 -123
- package/es/store/router-permission.mjs +75 -46
- package/es/store/user.mjs +100 -71
- package/es/style.css +769 -1
- package/es/utils/dom.mjs +20 -16
- package/es/utils/export.mjs +34 -18
- package/es/utils/id.mjs +5 -3
- package/es/utils/router.mjs +21 -14
- package/es/utils/theme-scale.mjs +50 -35
- package/es/utils/time.mjs +20 -14
- package/package.json +4 -3
- package/src/bridge/README.md +5 -0
- package/src/bridge/docs/README.md +72 -0
- package/src/components/README.md +84 -0
- package/src/components/app-layout/README.md +46 -0
- package/src/components/app-layout/docs/README-AppAside.md +69 -0
- package/src/components/app-layout/docs/README-AppBody.md +81 -0
- package/src/components/app-layout/docs/README-AppBreadcrumb.md +71 -0
- package/src/components/app-layout/docs/README-AppFooter.md +41 -0
- package/src/components/app-layout/docs/README-AppHeader.md +73 -0
- package/src/components/app-layout/docs/README-AppLayout.md +83 -0
- package/src/components/app-layout/docs/README-AppPage.md +80 -0
- package/src/components/app-layout/docs/README-AppSidebar.md +70 -0
- package/src/components/app-layout/docs/README-AppTheme.md +66 -0
- package/src/components/data-view/README.md +19 -0
- package/src/components/data-view/docs/README-DataListView.md +114 -0
- package/src/components/display/README.md +23 -0
- package/src/components/display/docs/README-ActionBtn.md +84 -0
- package/src/components/display/docs/README-ActionBtnGroup.md +96 -0
- package/src/components/display/docs/README-ActionConfirm.md +77 -0
- package/src/components/display/docs/README-BooleanTag.md +76 -0
- package/src/components/display/docs/README-HeightProvider.md +74 -0
- package/src/components/display/docs/README-TabsMain.md +99 -0
- package/src/components/display/docs/README-WatchSize.md +70 -0
- package/src/components/form/README.md +24 -0
- package/src/components/form/docs/README-FormItemNestForm.md +86 -0
- package/src/components/form/docs/README-FormItemNestFormList.md +93 -0
- package/src/components/form/docs/README-FormMain.md +101 -0
- package/src/components/form/docs/README-FormSearch.md +89 -0
- package/src/components/form/docs/README-FormSubmitBtn.md +72 -0
- package/src/components/form/docs/README-FormSubmitPanel.md +97 -0
- package/src/components/list-page/README.md +16 -0
- package/src/components/list-page/docs/README-ListPage.md +136 -0
- package/src/components/menu/README.md +19 -0
- package/src/components/menu/docs/README-MenuItemSub.md +53 -0
- package/src/components/menu/docs/README-MenuTree.md +76 -0
- package/src/components/misc/README.md +21 -0
- package/src/components/misc/docs/README-AutoRefresh.md +74 -0
- package/src/components/misc/docs/README-AutoRefreshGroup.md +74 -0
- package/src/components/misc/docs/README-SelectModule.md +72 -0
- package/src/components/modal/README.md +21 -0
- package/src/components/modal/docs/README-ModalConfirm.md +105 -0
- package/src/components/modal/docs/README-ModalDetail.md +103 -0
- package/src/components/modal/docs/README-ModalForm.md +97 -0
- package/src/components/modal/docs/README-ModalPorter.md +92 -0
- package/src/components/modal/docs/README-ModalShelf.md +115 -0
- package/src/components/panel/README.md +19 -0
- package/src/components/panel/docs/README-PanelMain.md +149 -0
- package/src/components/slot-layout/README.md +17 -0
- package/src/components/slot-layout/docs/README-SlotLayoutFlowAside.md +83 -0
- package/src/components/slot-layout/docs/README-SlotLayoutTemplate.md +73 -0
- package/src/components/table/README.md +17 -0
- package/src/components/table/docs/README-TableMain.md +140 -0
- package/src/hooks/README.md +5 -0
- package/src/hooks/docs/README.md +49 -0
- package/types/bridge/config-hook.d.ts +68 -0
- package/types/bridge/index.d.ts +411 -0
- package/types/bridge/layout.d.ts +40 -0
- package/types/bridge/plugin.d.ts +18 -0
- package/types/bridge/route.d.ts +20 -1
- package/types/bridge/state.d.ts +14 -0
- package/types/bridge/storage.d.ts +9 -0
- package/types/bridge/theme/index.d.ts +7 -0
- package/types/bridge/theme/persist.d.ts +12 -0
- package/types/bridge/theme/system-dark.d.ts +12 -0
- package/types/bridge/theme/types.d.ts +238 -0
- package/types/components/app-layout/AppAside.vue.d.ts +1 -0
- package/types/components/app-layout/AppCollapseToggle.vue.d.ts +3 -0
- package/types/components/app-layout/AppHeader.vue.d.ts +3 -0
- package/types/components/app-layout/AppLayout.vue.d.ts +12 -0
- package/types/components/app-layout/AppPage.vue.d.ts +17 -0
- package/types/components/app-layout/AppSidebar.vue.d.ts +2 -0
- package/types/components/app-layout/app-page-geometry.d.ts +48 -0
- package/types/components/app-layout/keep-alive.d.ts +17 -0
- package/types/components/app-layout/types.d.ts +125 -0
- package/types/components/app-layout/viewport.d.ts +28 -0
- package/types/components/data-view/DataListViewItem.vue.d.ts +8 -0
- package/types/components/data-view/index.d.ts +4 -0
- package/types/components/data-view/types.d.ts +42 -0
- package/types/components/data-view/utils.d.ts +3 -0
- package/types/components/display/TabsHeader.vue.d.ts +2 -0
- package/types/components/display/TabsMain.vue.d.ts +2 -0
- package/types/components/display/TabsRefineFlow.vue.d.ts +1 -0
- package/types/components/display/TabsTile.vue.d.ts +247 -12
- package/types/components/display/WatchSize.vue.d.ts +9 -0
- package/types/components/display/index.d.ts +37 -1
- package/types/components/display/types.d.ts +163 -0
- package/types/components/display/use-tabs-query-sync.d.ts +29 -0
- package/types/components/form/FormItemNestForm.vue.d.ts +5 -0
- package/types/components/form/FormItemNestFormList.vue.d.ts +17 -0
- package/types/components/form/FormVerifyCode.vue.d.ts +9 -0
- package/types/components/form/FormVerifyImage.vue.d.ts +1 -0
- package/types/components/form/form-search-utils.d.ts +34 -0
- package/types/components/form/nest-form-item-list.d.ts +28 -0
- package/types/components/form/nest-form-item.d.ts +21 -0
- package/types/components/form/nest-registry.d.ts +14 -0
- package/types/components/form/types.d.ts +208 -8
- package/types/components/form/use-form-submit.d.ts +13 -0
- package/types/components/form/use-layout-by-container.d.ts +23 -0
- package/types/components/form/use-nest-form-list.d.ts +13 -0
- package/types/components/form/use-nest-form.d.ts +15 -0
- package/types/components/form/use-nest-layout-scale.d.ts +12 -0
- package/types/components/form/utils.d.ts +56 -1
- package/types/components/list-page/ListPage.vue.d.ts +6 -0
- package/types/components/list-page/types.d.ts +50 -2
- package/types/components/list-page/use-sticky.d.ts +23 -0
- package/types/components/misc/index.d.ts +6 -1
- package/types/components/misc/types.d.ts +7 -0
- package/types/components/modal/ModalConfirm.vue.d.ts +29 -0
- package/types/components/modal/index.d.ts +7 -1
- package/types/components/modal/modal-shelf-core.d.ts +3 -0
- package/types/components/modal/modal-shelf-hierarchy.d.ts +4 -0
- package/types/components/modal/modal-shelf-types.d.ts +34 -0
- package/types/components/modal/types.d.ts +63 -2
- package/types/components/panel/PanelItemNestForm.vue.d.ts +6 -0
- package/types/components/panel/PanelItemNestPanel.vue.d.ts +5 -0
- package/types/components/panel/nest-panel-form.d.ts +21 -0
- package/types/components/panel/nest-panel-item.d.ts +14 -0
- package/types/components/panel/types.d.ts +52 -1
- package/types/components/slot-layout/SlotLayoutTemplate.vue.d.ts +21 -0
- package/types/components/slot-layout/types.d.ts +4 -0
- package/types/components/table/constants.d.ts +8 -0
- package/types/components/table/types.d.ts +140 -9
- package/types/components/table/use-fill-height.d.ts +14 -0
- package/types/components/table/use-table-skeleton.d.ts +16 -0
- package/types/config/list-model.d.ts +29 -0
- package/types/config/route.d.ts +2 -0
- package/types/helpers/form.d.ts +5 -0
- package/types/helpers/list-helper.d.ts +26 -0
- package/types/helpers/types.d.ts +11 -0
- package/types/hooks/activated.d.ts +23 -0
- package/types/hooks/feel-size.d.ts +2 -0
- package/types/hooks/menus-dispatch.d.ts +4 -0
- package/types/hooks/timeout.d.ts +4 -0
- package/types/hooks/use-channel-viewport-height.d.ts +8 -0
- package/types/hooks/use-custom-breakpoint.d.ts +19 -0
- package/types/hooks/use-observe-size.d.ts +29 -0
- package/types/hooks/use-theme-apply.d.ts +23 -0
- package/types/hooks/use-viewport-apply.d.ts +12 -0
- package/types/inject/key.d.ts +163 -0
- package/types/injectInfo.json.d.ts +1 -1
- package/types/router/group-redirect.d.ts +9 -0
- package/types/router/guard/index.d.ts +13 -0
- package/types/router/guard/login.d.ts +1 -0
- package/types/router/guard/permission.d.ts +1 -0
- package/types/router/guard/types.d.ts +3 -0
- package/types/store/app.d.ts +27 -0
- package/types/store/router-permission.d.ts +53 -0
- package/types/store/user.d.ts +24 -0
- package/types/types/dot-path.d.ts +8 -0
- package/types/types/route.d.ts +45 -0
- package/types/types/utility-types.d.ts +7 -0
- package/types/utils/dom.d.ts +22 -0
- package/types/utils/export.d.ts +16 -1
- package/types/utils/id.d.ts +1 -0
- package/types/utils/router.d.ts +2 -0
- package/types/utils/theme-scale.d.ts +31 -0
- package/types/utils/time.d.ts +1 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# WatchSize(尺寸观测组件)
|
|
2
|
+
|
|
3
|
+
> 通用尺寸观测:包一层即得自身 clientHeight / clientWidth 变化(激活首测 + window resize + onUpdated + 可选 ResizeObserver),按 mode 派发 heightChange / widthChange。
|
|
4
|
+
> 范式页:无独立范式页——组件级测量工具,被容器组件内嵌消费(核心实证:`packages/core/src/components/display/__tests__/`)
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:需要拿到「自身盒子」尺寸变化的容器组件内部 / 消费方包装层
|
|
9
|
+
- **何时不用**:需要「视口高 − 页头高 → 内容可用高」计算的场景用 `HeightProvider`(本组件只报自身测量值,不算账)
|
|
10
|
+
- 测量时机:激活首测 + window resize + onUpdated(激活态)+(可选)RO;失活 cancel 在途防抖、卸载 flush 补发终值
|
|
11
|
+
|
|
12
|
+
## 快速上手(最小可用)
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<WatchSize mode="height" @height-change="onHeightChange">
|
|
16
|
+
<div>...</div>
|
|
17
|
+
</WatchSize>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**要点**:
|
|
21
|
+
|
|
22
|
+
- `observeResize` 默认关;需要测「不触发自身重渲染的尺寸变化」(CSS 过渡折叠 / 异步撑开)时开启 RO
|
|
23
|
+
- `debounceTime` 只吃初始值,后续变化不更新
|
|
24
|
+
- 失活 cancel 在途防抖、卸载 flush 补发终值——终值不丢
|
|
25
|
+
|
|
26
|
+
## 能力边界 / 按需使用
|
|
27
|
+
|
|
28
|
+
- **`observeResize`(ResizeObserver):默认关。** 默认测量链(激活首测 + window resize + onUpdated)已覆盖「渲染驱动的尺寸变化」(v-if/v-show / 样式响应式)——普通场景即够用;仅当测「不触发自身重渲染的尺寸变化」(CSS 过渡折叠 / 异步撑开)才开——判据:尺寸变化过程中组件自身不重渲染、onUpdated 读不到最终值。
|
|
29
|
+
- **`debounceTime`:默认 `16`ms 即够用。** 仅当变化频率极高(连续 resize / 连续折叠)需聚合事件流时才调大;⚠️ 只吃初始值,后续变化不更新。
|
|
30
|
+
- **`mode`:默认 `"height"`。** 仅需横向尺寸(侧栏宽 / 横向布局)才设 `"width"` / `"both"`。
|
|
31
|
+
- **优先复用容器内嵌,[MUST NOT] 重复造轮**:ListPage(header / 操作槽量高)、HeightProvider(#header 量高得 reserve)等已内嵌消费本组件;仅自定义容器需要自身盒尺寸时才直用。
|
|
32
|
+
- **完整能力演示**:无独立范式页(组件级测量工具)——核心实证 `packages/core/src/components/display/__tests__/`。
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
36
|
+
|
|
37
|
+
### Props
|
|
38
|
+
|
|
39
|
+
| name | type | 默认 | 语义 |
|
|
40
|
+
| --- | --- | --- | --- |
|
|
41
|
+
| `mode` | `"height" \| "width" \| "both"?` | `"height"` | 观测维度,按 mode 派发 heightChange / widthChange |
|
|
42
|
+
| `observeResize` | `boolean?` | `false` | 是否 ResizeObserver 观测自身盒,可测「不触发自身重渲染的尺寸变化」(CSS 过渡折叠/异步撑开) |
|
|
43
|
+
| `debounceTime` | `number?` | `16` | 防抖毫秒;⚠️ 只吃初始值,后续变化不更新 |
|
|
44
|
+
|
|
45
|
+
### Emits
|
|
46
|
+
|
|
47
|
+
| 事件 | 载荷 | 语义 |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| `heightChange` | `value: number` | 高度变化(clientHeight,按 mode 派发) |
|
|
50
|
+
| `widthChange` | `value: number` | 宽度变化(clientWidth,按 mode 派发) |
|
|
51
|
+
|
|
52
|
+
### Slots
|
|
53
|
+
|
|
54
|
+
| 槽 | scope | 语义 |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| `#default` | 无 | 被观测内容 |
|
|
57
|
+
|
|
58
|
+
### Expose
|
|
59
|
+
|
|
60
|
+
无
|
|
61
|
+
|
|
62
|
+
## 反模式 / 注意
|
|
63
|
+
|
|
64
|
+
- **过渡动画尺寸变化未开 observeResize**:onUpdated 读起点漏最终值(CSS transition 期间)——动画折叠场景 [MUST] 开 RO
|
|
65
|
+
- **动态改 debounceTime**:只吃初始值,后续变化不更新(无效)
|
|
66
|
+
|
|
67
|
+
## 关联
|
|
68
|
+
|
|
69
|
+
- 下游消费:`HeightProvider`(#header 槽经 WatchSize 测高得 reserve)
|
|
70
|
+
- 核心实证:`packages/core/src/components/display/__tests__/`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# form 表单族
|
|
2
|
+
|
|
3
|
+
配置式表单核心(11 组件,最大族):`list` 配置驱动渲染 / 校验 / 序列化,`data` 同引用绑定,generate / parse / stringify 三方法 round-trip。
|
|
4
|
+
|
|
5
|
+
## 组件文档(docs/)
|
|
6
|
+
|
|
7
|
+
- [FormMain](./docs/README-FormMain.md) — 配置式表单核心容器
|
|
8
|
+
- [FormSearch](./docs/README-FormSearch.md) — 搜索表单(折叠 / 操作区 / staticQuery)
|
|
9
|
+
- [FormSubmitPanel](./docs/README-FormSubmitPanel.md) — 纯表单空间一等公民(提交 / 取消 / 重置操作区)
|
|
10
|
+
- [FormSubmitBtn](./docs/README-FormSubmitBtn.md) — 提交按钮(validate → stringify → submitFn 管线)
|
|
11
|
+
- [FormItemNestForm](./docs/README-FormItemNestForm.md) — 嵌套子表单(C1,级联校验)
|
|
12
|
+
- [FormItemNestFormList](./docs/README-FormItemNestFormList.md) — 数组子表单(C4,行增删 + min/max)
|
|
13
|
+
- FormSelect / FormRadioGroup / FormTree / FormVerifyImage / FormVerifyCode — 文档待补
|
|
14
|
+
|
|
15
|
+
## 关键类型与 helper
|
|
16
|
+
|
|
17
|
+
- 类型:`FormItemConfig` / `FormItemConfigList` / `FormMainInstance` / `FormSearchInstance` / `FormScope`(全部经 `./types` 导出)
|
|
18
|
+
- helper:`nestFormItem`(C1)/ `nestFormItemList`(C4)/ `useNestForm` / `useNestFormList` / `useNestLayoutScale`
|
|
19
|
+
- 工具:`generateFormData` / `parseFormData` / `stringifyFormData` / `swiftFormItemConfig`
|
|
20
|
+
- 内部不导出:`FormItem`(仅 FormMain 内部)、`use-form-submit`、`use-layout-by-container`
|
|
21
|
+
|
|
22
|
+
## 范式页(apps/reference)
|
|
23
|
+
|
|
24
|
+
- `/form/guide`(FormMain 最佳实践)/ `/form/container-breakpoint`(容器断点)/ `/form/submit-btn/showcase`、`/form/submit-panel/showcase`、`/form/nest-form/showcase`、`/form/nest-form-list/showcase`、`/form/nest-form-submit-panel/showcase`
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# FormItemNestForm(嵌套子表单 C1)
|
|
2
|
+
|
|
3
|
+
> 单层嵌套子表单:父 item 内嵌一个子 FormMain(modelValue 同引用绑定父 `data[key]`),级联校验 / 重置经父 FormMain 注册表自动贯通。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/form/nest-form/showcase/`(C1 单独场景)、`pages/form/nest-form-list/showcase/`(C4 行内套 C1)
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:一个字段下挂一组子字段(如「扩展信息」内含多字段),或 C4 行列表内每行再嵌套子表单
|
|
9
|
+
- **何时不用**:同层平铺字段直接用 FormMain.list;多行同构子表用 `FormItemNestFormList`(C4)
|
|
10
|
+
- 内部机制:子 FormMain 的 expose 经 `useNestForm` 注册进父 `FORM_NEST_REGISTRY_KEY`(`nestKey` 作索引)——父 `validate()` / `resetFields()` / `clearValidate(key?)` 自动级联到子表
|
|
11
|
+
- 组件自身无 emits / slots / expose;推荐经 `nestFormItem` helper 织入配置,而非手写组件用法
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
配置面走 helper(`nestFormItem` 是推荐姿势,织入普通 FormMain.list):
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { FormMain, swiftFormItemConfig, nestFormItem, generateFormData } from "@done-coding/admin-core";
|
|
19
|
+
const list: FormItemConfigList = [
|
|
20
|
+
swiftFormItemConfig({ key: "name", label: "姓名", type: "input", required: true, render: ElInput }),
|
|
21
|
+
nestFormItem({ key: "extra", label: "扩展信息", list: extraList }), // 子表单零配置织入
|
|
22
|
+
];
|
|
23
|
+
const data = ref(generateFormData(list));
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<FormMain :list="list" :data="data" />
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**要点**:
|
|
31
|
+
|
|
32
|
+
- `nestFormItem` 自动织入 `render`(markRaw 组件引用)+ `init`(缺省 `generateFormData(list)`)+ `stringify` / `parse`(缺省递归子 list)+ `parentSpan`——配置面只写 `{ key, label, list }` 即完成
|
|
33
|
+
- v-model 语义:modelValue 是父 `data[key]` 对象,同引用 in-place——按此语义改属性,父 data 即子表数据
|
|
34
|
+
- 级联校验零接线:父 FormMain `validate()` 穿透到子表单(nestKey 注册进 exposeMap)
|
|
35
|
+
|
|
36
|
+
## 能力边界 / 按需使用
|
|
37
|
+
|
|
38
|
+
- **默认即够用:`nestFormItem({ key, label, list })` 即完成嵌套**(render / init / stringify / parse / parentSpan 自动织入,级联校验零接线)。以下全部按需开:
|
|
39
|
+
- `layout` / `rowGutter`:默认未设 = 吃父级布局;仅当子表单需要独立布局才设。
|
|
40
|
+
- `rebase`:默认 `true` 叠本层嵌套布局 rebase(配合 `parentSpan` 算因子);仅当不需要层级缩放(layout 原样直透)才设 `false`。
|
|
41
|
+
- `shadowColor`:默认吃 CSS 变量自适配(随主题 / 亮暗切换);显式传仅当确需跨主题固定色。
|
|
42
|
+
- 多行同构子表(一对多)→ 不走本组件,用 `FormItemNestFormList`(C4)。
|
|
43
|
+
- **完整能力演示**(C1 单独场景 / C4 行内套 C1):`apps/reference/src/pages/form/nest-form/showcase/`、`pages/form/nest-form-list/showcase/`——能力展示,非推荐默认。
|
|
44
|
+
|
|
45
|
+
## API
|
|
46
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
47
|
+
|
|
48
|
+
### Props(内联 defineProps)
|
|
49
|
+
|
|
50
|
+
| name | type | 默认 | 语义 |
|
|
51
|
+
| --- | --- | --- | --- |
|
|
52
|
+
| `nestKey` | `string`(必填) | — | 所属父 item key(注册进父 FormMain exposeMap 的索引,供级联 validate / clear / reset) |
|
|
53
|
+
| `list` | `FormItemConfigList`(必填) | — | 子表单配置 |
|
|
54
|
+
| `layout` | `Partial<ColProps>` | 未设 | 子 FormMain 布局 |
|
|
55
|
+
| `rowGutter` | `number` | 未设 | 子行间距 |
|
|
56
|
+
| `shadowColor` | `string` | CSS 变量自适配 | 外环阴影色(显式传才内联覆盖) |
|
|
57
|
+
| `parentSpan` | `number` | 未设 | 父 item 代表 span(P3 rebase 算因子) |
|
|
58
|
+
| `rebase` | `boolean` | `true` | 是否叠本层嵌套布局 rebase(`false`=layout 原样直透) |
|
|
59
|
+
|
|
60
|
+
### v-model
|
|
61
|
+
|
|
62
|
+
`modelValue: Record<string, any>`(defineModel,默认 `() => ({})`)——等于父 `data[key]` 对象,同引用 in-place。
|
|
63
|
+
|
|
64
|
+
### Emits / Slots / Expose
|
|
65
|
+
|
|
66
|
+
无(子 FormMain expose 经 `useNestForm` 注册到父 registry)。
|
|
67
|
+
|
|
68
|
+
### 配套 helper:`nestFormItem(options: NestFormItemOptions): FormItemConfig`
|
|
69
|
+
|
|
70
|
+
自动织入:`render`(markRaw 组件引用)、`init`(缺省 `generateFormData(list)`)、`stringify` / `parse`(缺省递归子 list)、`parentSpan`。
|
|
71
|
+
|
|
72
|
+
`NestFormItemOptions` 含:`key` / `label` / `list` / `layout` / `rowGutter` / `shadowColor` / `init` / `stringify` / `parse` / `rebase`。
|
|
73
|
+
|
|
74
|
+
## 反模式 / 注意
|
|
75
|
+
|
|
76
|
+
- **手写嵌套子表单配置**:直接手写 render 挂子 FormMain 会绕过注册机制,级联校验断裂——[MUST] 用 `nestFormItem` / 本组件
|
|
77
|
+
- **nestKey 与父 key 不一致**:nestKey 是父 item key,注册索引对不上则级联失效
|
|
78
|
+
- **shadowColor 显式传才内联覆盖**:默认吃 CSS 变量自适配(随主题 / 亮暗切换);除非确需跨主题固定色,让默认值跟随主题系
|
|
79
|
+
- **rebase 语义**:默认 `true` 叠本层嵌套布局 rebase(配合 `parentSpan` 算因子);`false` 时 layout 原样直透
|
|
80
|
+
|
|
81
|
+
## 关联
|
|
82
|
+
|
|
83
|
+
- 表单族:`FormItemNestFormList`(C4 多行同构)、`FormMain`(底座与注册容器)、`FormSearch` / `FormSubmitPanel`(上层形态)
|
|
84
|
+
- helpers:`nestFormItem`(C1 配置生成)、`useNestForm`(expose 注册)、`useNestLayoutScale`(布局 rebase)
|
|
85
|
+
- 内部 provide:`FORM_NEST_REGISTRY_KEY`(FormMain)、`NEST_LAYOUT_SCALE_KEY`(FormMain)
|
|
86
|
+
- 范式页:`apps/reference/src/pages/form/nest-form/showcase/`、`pages/form/nest-form-list/showcase/`
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# FormItemNestFormList(嵌套行列表 C4)
|
|
2
|
+
|
|
3
|
+
> 多行同构子表单列表:一行一个子 FormMain(v-model 数组真源),min / max 行数约束 + 新增 / 删除(可二次确认)+ render-fn 头部 / 底部自定义。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/form/nest-form-list/showcase/`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:一对多子表(联系人列表、地址列表…),行内字段同构,可增删
|
|
9
|
+
- **何时不用**:单层嵌套用 `FormItemNestForm`(C1);行内字段需再异构嵌套时 C4 行内再套 C1
|
|
10
|
+
- 内部机制:`useNestFormList` 注册 **1 个聚合 expose**(fan-out 遍历各行)进父 `FORM_NEST_REGISTRY_KEY`——父 `validate()` 级联校验每一行
|
|
11
|
+
- 组件自身无 emits / slots / expose;推荐经 `nestFormItemList` helper 织入配置
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
配置面走 helper(单层 C4 即完整;`nestFormItemList` 织入普通 FormMain.list):
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { FormMain, swiftFormItemConfig, nestFormItemList, generateFormData } from "@done-coding/admin-core";
|
|
19
|
+
const list: FormItemConfigList = [
|
|
20
|
+
swiftFormItemConfig({ key: "name", label: "姓名", type: "input", required: true, render: ElInput }),
|
|
21
|
+
nestFormItemList({ key: "addresses", label: "地址列表", list: addressList, min: 1, max: 2 }),
|
|
22
|
+
];
|
|
23
|
+
const data = ref(generateFormData(list));
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<FormMain :list="list" :data="data" />
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**要点**:
|
|
31
|
+
|
|
32
|
+
- v-model 是**数组真源**:push / splice 原地改即增删行;行数约束叠加在增删动作上——删到 `min` 禁删、达 `max` 禁新增
|
|
33
|
+
- `nestFormItemList` 自动织入 render / init / stringify / parse + `rules`(min / max 长度规则与自动织入合并)——`generateFormData(list)` 即按配置产出完整嵌套结构
|
|
34
|
+
- 两层防线各管一段:min / max 硬约束(禁删 / 禁新增)在交互层,长度硬校验走父 item `rules`(不补数据)
|
|
35
|
+
- `removeConfirm` 默认开:行删除二次确认(`true`=默认 popconfirm「确认删除该项?」;`false`=直删;对象=自定义)
|
|
36
|
+
|
|
37
|
+
## 能力边界 / 按需使用
|
|
38
|
+
|
|
39
|
+
- **默认即够用:`nestFormItemList({ key, label, list })` 即完成增删行列表**(min/max 不约束、删除带默认确认)。以下全部按需开:
|
|
40
|
+
- `min` / `max`:默认 `0` / `Infinity` 即够用(不约束);仅当业务要求行数上下限才设——[MUST] 同时配 `rules`(长度硬校验走父 item `rules`,min / max 只是交互层禁删 / 禁增)。
|
|
41
|
+
- `removeConfirm`:默认开(删除需确认);仅当删除属低风险 / 高频操作(或外层已有更强确认层)才设 `false` 直删;对象 = 自定义文案。
|
|
42
|
+
- `itemFactory`:默认 `generateFormData(list)` 即够用;仅当新增行需要特殊初始值才设。
|
|
43
|
+
- `rowKey`:默认内部 WeakMap 自增 rowId 即够用(组件生命周期内行身份稳定);仅当行身份需跨会话稳定(对应后端 id)才显式传字段名。
|
|
44
|
+
- `headerRender` / `footerRender`:默认不设(内置新增按钮);仅当列表头尾需要自定义内容(计数 / 汇总 / 定制按钮)才用 render-fn(非 slot)。
|
|
45
|
+
- 行内再嵌套(C4 套 C4 / 行内套 C1):按需,行 `list` 内再织 `nestFormItem` / `nestFormItemList`。
|
|
46
|
+
- **完整能力演示**(C4 套 C4 / C1 三层嵌套 + hide 联动):`apps/reference/src/pages/form/nest-form-list/showcase/`——能力展示,非推荐默认。
|
|
47
|
+
|
|
48
|
+
## API
|
|
49
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
50
|
+
|
|
51
|
+
### Props(内联 defineProps)
|
|
52
|
+
|
|
53
|
+
| name | type | 默认 | 语义 |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `nestKey` | `string`(必填) | — | 父 item key(聚合 expose 注册索引) |
|
|
56
|
+
| `list` | `FormItemConfigList`(必填) | — | 每行子表单配置 |
|
|
57
|
+
| `rowKey` | `string` | 未设 | 行稳定 id 字段(缺省内部 WeakMap 自增 rowId) |
|
|
58
|
+
| `itemFactory` | `() => T` | `generateFormData(list)` | 新增行工厂 |
|
|
59
|
+
| `min` | `number` | `0` | 最少行(删到 min 禁删;硬约束走父 item rules 长度校验,不补数据) |
|
|
60
|
+
| `max` | `number` | `Infinity` | 最多行(达上限禁新增) |
|
|
61
|
+
| `layout` / `rowGutter` | — | — | 每行子 FormMain 布局 / 行距 |
|
|
62
|
+
| `addText` / `removeText` | `string` | `"新增"` / `"删除"` | 按钮文案 |
|
|
63
|
+
| `headerRender` | `({ count, max }) => VNodeChild` | 未设 | 顶部自定义渲染(render-fn,非 slot) |
|
|
64
|
+
| `footerRender` | `({ count, max, canAdd, add }) => VNodeChild` | 未设 | 底部自定义渲染(缺省=内置新增按钮) |
|
|
65
|
+
| `shadowColor` | `string` | CSS 变量 | 外环 + 每行分割阴影色 |
|
|
66
|
+
| `parentSpan` / `rebase` | — | rebase `true` | 同 C1(父 item 代表 span / 是否叠嵌套 rebase) |
|
|
67
|
+
| `removeConfirm` | `boolean \| ActionBtnConfirmConfig` | `true` | 行删除二次确认(`true`=默认 popconfirm「确认删除该项?」;`false`=直删;对象=自定义) |
|
|
68
|
+
|
|
69
|
+
### v-model
|
|
70
|
+
|
|
71
|
+
`modelValue: T[]`(defineModel,默认 `() => []`)——数组真源,push / splice 原地改。
|
|
72
|
+
|
|
73
|
+
### Emits / Slots / Expose
|
|
74
|
+
|
|
75
|
+
无(`useNestFormList` 注册 1 个聚合 expose,fan-out 遍历各行)。
|
|
76
|
+
|
|
77
|
+
### 配套 helper:`nestFormItemList(options: NestFormItemListOptions)`
|
|
78
|
+
|
|
79
|
+
自动织入 render / init / stringify / parse + `parentSpan`;options 另含 `rules`(与自动织入的 min / max 长度规则合并)。
|
|
80
|
+
|
|
81
|
+
## 反模式 / 注意
|
|
82
|
+
|
|
83
|
+
- **手写行子表单配置**:绕过注册机制则多行级联校验断裂——[MUST] 用 `nestFormItemList` / 本组件
|
|
84
|
+
- **只靠 min / max 交互约束**:禁删 / 禁新增是交互层防线,长度硬校验走父 item `rules`——需要提交时兜底校验(如绕过 UI 直接改数据)必须配 `rules`
|
|
85
|
+
- **headerRender / footerRender 是 render-fn 不是 slot**:在配置内以函数形式提供,不能当插槽模板使用
|
|
86
|
+
- **rowKey 稳定性**:缺省走内部 WeakMap 自增 rowId(组件生命周期内行身份稳定);行身份需跨会话稳定(如对应后端 id)时显式传 `rowKey` 字段名
|
|
87
|
+
|
|
88
|
+
## 关联
|
|
89
|
+
|
|
90
|
+
- 表单族:`FormItemNestForm`(C1 单层嵌套)、`FormMain`(底座与注册容器)、`FormSubmitPanel`(提交面)
|
|
91
|
+
- helpers:`nestFormItemList`(C4 配置生成)、`useNestFormList`(聚合 expose 注册)、`nestFormItem`(C1)、`useNestLayoutScale`(布局 rebase)
|
|
92
|
+
- 内部 provide:`FORM_NEST_REGISTRY_KEY`(FormMain)、`NEST_LAYOUT_SCALE_KEY`(FormMain)
|
|
93
|
+
- 范式页:`apps/reference/src/pages/form/nest-form-list/showcase/`
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# FormMain(配置化表单主体)
|
|
2
|
+
|
|
3
|
+
> 配置化表单核心容器:`list` 配置驱动渲染 / 校验 / 序列化,`data` 同引用绑定,generate / parse / stringify 三方法做数据 round-trip。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/form/guide/`(最佳实践)
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:任何配置化表单页的主体——搜索类前缀走 FormSearch、提交类面板走 FormSubmitPanel,本组件是两者与嵌套子表单(FormItemNestForm / FormItemNestFormList)的底座
|
|
9
|
+
- **何时不用**:搜索表单用 `FormSearch`(自带折叠 + 操作区);带提交/取消操作区的用 `FormSubmitPanel`;嵌套子表用 C1 / C4 组件族
|
|
10
|
+
- 内部组合:单项渲染由 `FormItem` 完成(未导出,仅 FormMain 内部);内部 provide `FORM_NEST_REGISTRY_KEY`(嵌套子表单 expose 注册,级联 validate/clear/reset)与 `NEST_LAYOUT_SCALE_KEY`(嵌套布局 rebase)
|
|
11
|
+
- 根节点为 ElForm,`inheritAttrs: true`(class / attrs 自然落 ElForm 根)
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
最小表单 + 校验提交(默认值即够用):
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<FormMain ref="formMain" :list="list" :data="data" />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const formMain = ref<FormMainInstance>();
|
|
23
|
+
const data = ref(generateFormData(list));
|
|
24
|
+
const submit = async () => {
|
|
25
|
+
await formMain.value?.validate(); // 校验不通过即 reject,闸住提交
|
|
26
|
+
const payload = stringifyFormData(data.value, list); // 序列化为提交形态
|
|
27
|
+
await saveApi(payload);
|
|
28
|
+
};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**要点**:
|
|
32
|
+
|
|
33
|
+
- `list` 配置驱动渲染 / 校验 / 序列化;`data` 是 v-model 语义、**同引用绑定**——改 data 对象属性即改表单值
|
|
34
|
+
- 提交 = `validate()` 通过 → `stringifyFormData` 序列化 → 发 API;搜索(FormSearch)/ 提交面板(FormSubmitPanel)已内置此管线,裸用本组件只需两条裸函数 + 一行 validate
|
|
35
|
+
- 单项渲染可被具名槽 `#<config.key>` 覆盖;默认 slot 可整体接管栅格
|
|
36
|
+
|
|
37
|
+
## 能力边界 / 按需使用
|
|
38
|
+
|
|
39
|
+
- **三方法 round-trip(generate / parse / stringify):最小形态只用两条裸函数路——`generateFormData` 建初值 + `stringifyFormData` 序列化提交,即够用。** 仅当页面有「新增 / 编辑」双模式(编辑回填走 `parseFormData` + 留存分支编排)才需要三方法完整编排。
|
|
40
|
+
- `layout` / `rowGutter`:默认即够用(rowGutter=8,单项自带 layout);仅当需要整体栅格统一(如多列 span)才设 `layout`——单项 `layout` 优先。
|
|
41
|
+
- 具名槽 `#<config.key>`:默认关(单项由配置 render / props 驱动);仅当单一项需要完全自定义渲染(复杂组合控件)才开。
|
|
42
|
+
- `#default` 整体接管栅格:默认关、少用;仅当整个栅格结构需重构时开。
|
|
43
|
+
- `layoutByContainer`:默认关(按 window 媒体查询);仅当表单落入窄容器(侧栏 / 抽屉内嵌)且视口响应式挤崩时才开。
|
|
44
|
+
- **完整能力演示**(新增 / 编辑双模式三方法编排 + 校验提交):`apps/reference/src/pages/form/guide/`——能力展示,非推荐默认。
|
|
45
|
+
|
|
46
|
+
## API
|
|
47
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
48
|
+
|
|
49
|
+
### Props(泛型 `PO` 解析模型 / `SO` 格式化模型,`FormMainProps<PO, SO>`)
|
|
50
|
+
|
|
51
|
+
| name | type | 默认 | 语义 |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `list` | `FormItemConfigList<PO, SO>`(必填) | — | 表单项配置数组(驱动渲染/校验/序列化) |
|
|
54
|
+
| `data` | `PO`(必填) | — | 表单数据模型(v-model 语义,直接同引用绑定——改 data 对象属性即改表单值) |
|
|
55
|
+
| `layout` | `Partial<ColProps>` | 未设(不传则单项各自 layout) | 表单整体栅格布局,单项 layout 优先 |
|
|
56
|
+
| `rowGutter` | `number` | `8` | ElRow 横向列间距 |
|
|
57
|
+
| `layoutScale` | `number` | `1` | P3 嵌套 rebase 累乘因子(缺省 1=顶级行为不变,由联结薄壳算后传入) |
|
|
58
|
+
| `layoutByContainer` | `boolean` | `false` | 按容器断点校准响应式 span(默认按 window 媒体查询) |
|
|
59
|
+
|
|
60
|
+
### Emits
|
|
61
|
+
|
|
62
|
+
| 事件 | 载荷 | 语义 |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| `loadingChange` | `boolean` | 表单项变更 loading 状态变化(如上传在途) |
|
|
65
|
+
| `visibleChange` | `boolean` | 显隐(hide 驱动)变化 |
|
|
66
|
+
| `submit` | `FormItemSubmitType` | 表单项触发提交(`"blur"` / `"change"` / `"enter"`) |
|
|
67
|
+
|
|
68
|
+
### Slots
|
|
69
|
+
|
|
70
|
+
| 槽 | scope | 语义 |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| `#<config.key>` | FormItem 内部 mainProps(`modelValue` / `onUpdate:modelValue` / `placeholder` / 事件) | 覆盖单项渲染 |
|
|
73
|
+
| `#default` | `{ mergeLayout }` | 整体接管栅格(少用) |
|
|
74
|
+
|
|
75
|
+
### Expose(`FormMainInstance<PO, SO>`)
|
|
76
|
+
|
|
77
|
+
`validate(): Promise<void>`(本层 + 隐藏项过滤 + 嵌套子表单级联)、`resetFields()`、`clearValidate(key?)`、`generate(): PO`、`parse(stringifyData): PO`、`stringify()`(序列化对象)——三方法 round-trip。
|
|
78
|
+
|
|
79
|
+
### 关键类型
|
|
80
|
+
|
|
81
|
+
- `FormItemConfig<PO, SO, PK, PV, SV>`:单表单项配置——`key` / `label` / `labelHide` / `tip` / `layout` / `wrapProps` / `props` / `render` / `rules` / `init` / `parse` / `stringify` / `ignore` / `hide` / `beLink` / `extra`
|
|
82
|
+
- `FormItemConfigList<PO, SO>`:表单项配置数组(`FormMain.list` 的类型)
|
|
83
|
+
- `FormItemConfigExtra`:`extra` 快捷项——`isInput` / `isSelect`(OnlyOneKey 互斥)+ `enterSubmit` / `blurSubmit` / `changeSubmit`
|
|
84
|
+
- `FormItemLinkConfig<K, BV, OV>`:`beLink` 联动配置——`key` + `getValue(hostValue, ownValue, attachInfo)`
|
|
85
|
+
- `FormScope<PO, SO, ...>`:渲染 / 函数式配置的作用域——`{ data, config }`
|
|
86
|
+
- `ExtractFormStringifyFromObject` / `FromList`:从 `PO`+`SO` 提取序列化提交形态(类型级提取,剔除 symbol / never 键)
|
|
87
|
+
|
|
88
|
+
## 反模式 / 注意
|
|
89
|
+
|
|
90
|
+
- **手写嵌套子表单 render**:嵌套子表单(C1 / C4)与 `nestFormItem` / `nestFormItemList` helper 是既定通道,`FormItem` 未导出(仅 FormMain 内部)——[MUST NOT] 手写内联子表单 render 绕开注册机制(会失去级联 validate / clear / reset)
|
|
91
|
+
- **变更 loading 中提交**:表单项处于变更 loading(`FORM_ITEM_CHANGE_LOADING` Symbol 标记,如上传在途)时,`validate()` 直接 reject——提交被闸住,[MUST NOT] 绕过 validate 直发提交
|
|
92
|
+
- **`layout` 与单项 `layout` 关系**:整体 layout 是兜底,单项 `layout` 优先(单项未设才吃整体)
|
|
93
|
+
- **三方法成对使用**:初值 / 回填 / 提交永远走 `generateFormData` / `parseFormData` / `stringifyFormData`(或 expose 三方法),避免手工拼对象破坏 round-trip
|
|
94
|
+
|
|
95
|
+
## 关联
|
|
96
|
+
|
|
97
|
+
- 表单族:`FormSearch`(搜索前缀,折叠 + 操作区)、`FormSubmitPanel`(提交面板)、`FormSubmitBtn`(提交按钮)、`FormItemNestForm`(C1 嵌套子表单)、`FormItemNestFormList`(C4 行列表)、`FormSelect` / `FormRadioGroup` / `FormTree` / `FormVerifyImage` / `FormVerifyCode`(单项形态)
|
|
98
|
+
- utils 公共函数:`generateFormData` / `parseFormData` / `stringifyFormData`、`getVModelSugar`、`getPlaceholder`、`getEnterSubmit` / `getBlurSubmit` / `getChangeSubmit`、`getDatePickerShortcuts`、`swiftFormItemConfig`、`resolveFormLayout`、`resolveLayoutSpan`、`ceilToTier`、`NEST_LAYOUT_TIERS`、`setInputComponent` / `setSelectComponent`、`FORM_ITEM_CHANGE_LOADING`(Symbol)
|
|
99
|
+
- helpers:`nestFormItem`(C1 配置生成)、`nestFormItemList`(C4)、`createNestFormExposeMap`、`useNestForm`、`useNestFormList`、`useNestLayoutScale`
|
|
100
|
+
- 内部 provide:`FORM_NEST_REGISTRY_KEY`(嵌套 expose 注册)、`NEST_LAYOUT_SCALE_KEY`(布局 rebase)
|
|
101
|
+
- 范式页:`apps/reference/src/pages/form/guide/`、`pages/form/nest-form/`(C1)、`pages/form/nest-form-list/`(C4)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# FormSearch(搜索表单)
|
|
2
|
+
|
|
3
|
+
> FormMain 的搜索前缀:自带折叠(maxRows 按真实几何换行)+ 内置操作区(展开更多 / 重置 / 查询),search emit 自动并入静态参数。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/menu/showcase/`(独立裸用);ListPage 内嵌场景见 `apps/reference/src/pages/list-page/guide/`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **空间一等公民是 `ListPage` 的搜索侧**:常规列表页 [MUST] 走 `ListPage`(内部即「FormSearch + TableMain」组合,搜索侧 props 双子扁平化、`staticQuery` 提升为直属 prop)——**FormSearch 一般不直接使用**
|
|
9
|
+
- **独立裸用仅当**:纯搜索区页面/组件(无表格,配合外部触发查询)
|
|
10
|
+
- **何时不用**:普通录入表单用 `FormMain`;带提交 / 取消操作区的用 `FormSubmitPanel`
|
|
11
|
+
- 与 FormMain 的差异:`rowGutter` 默认 14(FormMain 为 8)、`layout` 默认 `{xs:24, sm:12, md:12, lg:8, xl:6}`、`maxRows` 折叠、内置操作区按钮、`staticQuery` 并入 emit、expose 增 trigger 与折叠控制
|
|
12
|
+
- 根节点为 WatchSize 包裹的 `.form-search`,`inheritAttrs: false`(attrs 显式转发内层 FormMain)
|
|
13
|
+
|
|
14
|
+
## 快速上手(最小可用)
|
|
15
|
+
|
|
16
|
+
最小搜索表单(list / data / @search 即完整):
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<FormSearch :list="list" :data="data" @search="(q: any) => (query = q)" />
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**要点**:
|
|
23
|
+
|
|
24
|
+
- `@search` 载荷 = 表单序列化结果 `ExtractFormStringifyFromObject<PO, SO>` **并上 `staticQuery`**——静态参数天然并入,无需手工拼接
|
|
25
|
+
- 折叠(`maxRows` 默认 2 收起)+ 展开更多 / 重置 / 查询操作区内置默认即生效,零配置
|
|
26
|
+
- 单项覆盖走具名槽 `#<config.key>`,scope 是 FormItem 内部 mainProps——`v-bind="scope"` 直透给组件即可
|
|
27
|
+
|
|
28
|
+
## 能力边界 / 按需使用
|
|
29
|
+
|
|
30
|
+
- **默认即够用:`list` + `data` + `@search` 即为完整搜索形态**(折叠 + 操作区内置)。以下全部按需开:
|
|
31
|
+
- `staticQuery`:默认未设即够用;仅当有非表单静态参数(如固定状态筛选)需并入搜索载荷才设。
|
|
32
|
+
- `maxRows`:默认 `2`(收起折叠)即够用;`0`=不折叠全展开,仅当搜索项少 / 页面想全显才设。
|
|
33
|
+
- 具名槽 `#<config.key>`:默认关(单项由配置驱动);仅当单项需要完全自定义渲染(复杂组合控件)才开。
|
|
34
|
+
- `compact`:默认关;仅当搜索区落入受限窄栏(独立侧栏搜索)才开——窄栏场景优先容器断点系(`compact` / `layoutByContainer`),而非给单项 layout 写死 span。
|
|
35
|
+
- `layoutByContainer`:默认关;仅当容器断点折叠几何需要切到容器档才开。
|
|
36
|
+
- expose `triggerSearch()` / `triggerReset()` / `toggleCollapse()`:默认不需要(操作区按钮内置);仅当外部需程序化触发(如 ListPage 列插槽注入)才用。
|
|
37
|
+
- **完整能力演示**(staticQuery + 多 slot 覆盖 + 折叠回调):`apps/reference/src/pages/menu/showcase/`——能力展示,非推荐默认。
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
41
|
+
|
|
42
|
+
### Props(泛型 `PO` 解析 / `SO` 格式化 / `SQ` 静态参数,`FormSearchProps<PO, SO, SQ>` = FormMainProps + 以下)
|
|
43
|
+
|
|
44
|
+
| name | type | 默认 | 语义 |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| `list` | `FormItemConfigList<PO, SO>`(必填) | — | 同 FormMain,透传 |
|
|
47
|
+
| `data` | `PO`(必填) | — | 同 FormMain,透传 |
|
|
48
|
+
| `layout` | `Partial<ColProps>` | `{xs: 24, sm: 12, md: 12, lg: 8, xl: 6}` | 同 FormMain,默认值不同(搜索三列感) |
|
|
49
|
+
| `rowGutter` | `number` | `14` | 同 FormMain,默认值不同(FormMain 为 8) |
|
|
50
|
+
| `layoutScale` | `number` | `1` | 已声明 prop 不入 attrs 且未显式转发——**实际不传递**(内层 FormMain 恒吃默认 1),消费方传了无效 |
|
|
51
|
+
| `layoutByContainer` | `boolean` | `false` | 开启时折叠几何引擎断点源一并切到容器档 |
|
|
52
|
+
| `labelPosition` | `"right" \| "left" \| "top"` | `"right"` | 标签位置 |
|
|
53
|
+
| `labelWidth` | `string` | `"auto"` | 标签宽度 |
|
|
54
|
+
| `staticQuery` | `SQ` | 未设 | 静态参数(非表单非分页),并入搜索 emit 结果 |
|
|
55
|
+
| `maxRows` | `number` | `2` | 收起态最多渲染视觉行数(含操作区行),0=不折叠全展开;按真实几何换行计算 |
|
|
56
|
+
| `compact` | `boolean` | `false` | 受限窄栏模式:统一单列 span24 + label 置顶,maxRows 仍外部可控 |
|
|
57
|
+
|
|
58
|
+
### Emits
|
|
59
|
+
|
|
60
|
+
| 事件 | 载荷 | 语义 |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `search` | `data: ExtractFormStringifyFromObject<PO, SO> & SQ`;`type: FormSearchSearchType` | 查询 / 重置 / 单项提交触发(`"search"` / `"reset"` / `"blur"` / `"change"` / `"enter"`) |
|
|
63
|
+
| `heightChange` | `number` | 折叠 / 展开容器高度变化 |
|
|
64
|
+
| `visibleChange` | `boolean` | 显隐变化 |
|
|
65
|
+
|
|
66
|
+
### Slots
|
|
67
|
+
|
|
68
|
+
| 槽 | scope | 语义 |
|
|
69
|
+
| --- | --- | --- |
|
|
70
|
+
| `#<config.key>` | FormItem 内部 mainProps | 覆盖搜索单项(透传 FormMain) |
|
|
71
|
+
| `#default` | — | ⚠️ 被内置操作区按钮(展开更多 / 重置 / 查询)占用,消费方默认插槽不会被转发 |
|
|
72
|
+
|
|
73
|
+
### Expose(`FormSearchInstance<PO, SO>`,extends `Omit<FormMainInstance, "generate" \| "parse" \| "stringify">`)
|
|
74
|
+
|
|
75
|
+
继承:`validate()` / `resetFields()` / `clearValidate(key?)`(无三方法——搜索无 round-trip 需求);新增:`triggerSearch()` / `triggerReset()` / `toggleCollapse(nextValue?)` / `isCollapsed: ComputedRef<boolean>`。
|
|
76
|
+
|
|
77
|
+
## 反模式 / 注意
|
|
78
|
+
|
|
79
|
+
- **用 `#default` 插自定义按钮**:默认槽被内置操作区占用,不会渲染——自定义操作走 expose 的 trigger 方法,或交给 ListPage / 外层编排
|
|
80
|
+
- **`@search` 后手工再并 staticQuery**:载荷已含静态参数,再拼一次会重复
|
|
81
|
+
- **class 定向落点**:`inheritAttrs: false` + attrs 显式转发内层 FormMain——消费方 class 落在内层 ElForm,而非 `.form-search` 根(WatchSize 包裹);定向样式按实际落点写选择器
|
|
82
|
+
- **窄栏场景改 layout 硬撑**:`compact`(或 `layoutByContainer`)走容器断点几何,与 ElCol 的视口响应式不同源——窄栏挤崩场景优先容器断点系,而非给单项 layout 写死 span
|
|
83
|
+
|
|
84
|
+
## 关联
|
|
85
|
+
|
|
86
|
+
- 表单族:`FormMain`(底座,本组件为其搜索前缀)、`FormSubmitPanel` / `FormSubmitBtn`(提交面)、`FormItemNestForm` / `FormItemNestFormList`(嵌套)
|
|
87
|
+
- 组合页:`ListPage`(内部即「FormSearch + TableMain」,搜索侧 props 双子扁平化;`staticQuery` 被扁平提升为直属 prop,禁放 formSearchProps 内)
|
|
88
|
+
- 类型:`FormSearchSearchType` = `"search" \| "reset" \| FormItemSubmitType`;`FormSearchInstance<PO, SO>`
|
|
89
|
+
- 范式页:`apps/reference/src/pages/menu/showcase/`、`pages/list-page/guide/`
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# FormSubmitBtn(提交按钮)
|
|
2
|
+
|
|
3
|
+
> 挂 FormMain 实例的提交按钮:内置「validate → stringify → submitFn → 按钮 loading」管线。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/form/submit-btn/showcase/`;FormSubmitPanel 内置场景见 `apps/reference/src/pages/form/submit-panel/showcase/`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:已有 FormMain 实例,需要一个提交按钮且不想自管「校验 → 序列化 → 提交 → loading」管线
|
|
9
|
+
- **何时不用**:提交 + 取消 / 重置 + 面板壳用 `FormSubmitPanel`(内部即内置本组件,经 `submitBtnProps` 定制);无表单实例的普通按钮用 `ActionBtn`
|
|
10
|
+
- 提交 loading 由管线内置管理(`loading` 已从透传面 Omit)
|
|
11
|
+
|
|
12
|
+
## 快速上手(最小可用)
|
|
13
|
+
|
|
14
|
+
最小骨架(仅用必填 / 默认项,管线内部完成):
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<FormSubmitBtn
|
|
18
|
+
:formMainInstance="formMain"
|
|
19
|
+
:submitFn="submitFn"
|
|
20
|
+
submitText="保存"
|
|
21
|
+
@success="onSuccess" @fail="onFail" />
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**要点**:
|
|
25
|
+
|
|
26
|
+
- `formMainInstance` 传入 FormMain 的 ref 实例——管线在内部调 `validate()` / `stringify()`,消费方零接线
|
|
27
|
+
- `submitFn` 收 `stringifyData` 返回 Promise:resolve → `@success(stringifyData)`;reject → `@fail(error)`;在途按钮自动 loading
|
|
28
|
+
- `onSubmitStart()` 可在提交发起时同步回调(如弹层整体 loading 态)
|
|
29
|
+
|
|
30
|
+
## 能力边界 / 按需使用
|
|
31
|
+
|
|
32
|
+
- **默认即够用:`formMainInstance` + `submitFn` 即为完整提交按钮**(validate → stringify → submitFn → 按钮 loading 管线全内置);`submitText` 默认 `"提交"`。
|
|
33
|
+
- `onSubmitStart`:默认不设;仅当需要在提交发起时同步做外部动作(如弹层整体 loading 态)才设。
|
|
34
|
+
- 其余 ButtonProps:`type` 默认 `"primary"` 即够用;仅当需要按钮视觉定制(size / 样式)才传(`loading` 除外,由管线接管)。
|
|
35
|
+
- **完整能力演示**:`apps/reference/src/pages/form/submit-btn/showcase/`;FormSubmitPanel 内置场景见 `apps/reference/src/pages/form/submit-panel/showcase/`。
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
39
|
+
|
|
40
|
+
### Props(`FormSubmitBtnProps` = `Omit<ButtonProps, "loading">` + 以下)
|
|
41
|
+
|
|
42
|
+
| name | type | 默认 | 语义 |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| `formMainInstance` | `FormMainInstance`(必填) | — | 提交所挂的 FormMain 实例(管线内调 validate / stringify) |
|
|
45
|
+
| `submitFn` | `(stringifyData) => Promise<unknown>`(必填) | — | 提交方法 |
|
|
46
|
+
| `submitText` | `string` | `"提交"` | 按钮文本 |
|
|
47
|
+
| `onSubmitStart` | `() => void` | 未设 | 提交发起时同步回调 |
|
|
48
|
+
| 其余 | `Omit<ButtonProps, "loading">` | `type` 默认 `"primary"` | ElButton 全量透传(loading 除外,由管线接管) |
|
|
49
|
+
|
|
50
|
+
### Emits
|
|
51
|
+
|
|
52
|
+
| 事件 | 载荷 | 语义 |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `success` | `stringifyData` | submitFn resolve |
|
|
55
|
+
| `fail` | `error` | submitFn reject |
|
|
56
|
+
|
|
57
|
+
### Slots / Expose
|
|
58
|
+
|
|
59
|
+
无。
|
|
60
|
+
|
|
61
|
+
## 反模式 / 注意
|
|
62
|
+
|
|
63
|
+
- **自管 loading**:按钮 loading 由管线内置(`loading` 已从透传面 Omit)——[MUST NOT] 外部再传 `:loading` 或自建 submitting 状态
|
|
64
|
+
- **脱离表单实例使用**:`formMainInstance` 必填,未接实例时管线无处校验 / 序列化——裸用无意义
|
|
65
|
+
- **管线顺序固定**:validate → stringify → submitFn;校验失败即停,不发 submitFn
|
|
66
|
+
|
|
67
|
+
## 关联
|
|
68
|
+
|
|
69
|
+
- 内置进 `FormSubmitPanel`(经 `submitBtnProps` 定制,勿重复外挂)
|
|
70
|
+
- 按钮原语:`ActionBtn`(display 桶,confirm / loading 超集)——无表单实例的按钮走 ActionBtn
|
|
71
|
+
- 类型:`FormMainInstance<PO, SO>`(FormMain expose 类型)
|
|
72
|
+
- 范式页:`apps/reference/src/pages/form/submit-btn/showcase/`、`pages/form/submit-panel/showcase/`
|