@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,97 @@
|
|
|
1
|
+
# FormSubmitPanel(提交表单面板)
|
|
2
|
+
|
|
3
|
+
> FormMain 的提交面:`stringifyData` 作初值 + 内置「校验 → 序列化 → 提交」管线 + 取消 / 重置 / 提交操作区(可插槽替换),success / fail / parseDataChange 三事件闭环。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/form/submit-panel/showcase/`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **空间一等公民**:纯表单提交空间首选(表单页 / 弹窗内表单)——业务层能用 FormMain 处用 FormSubmitPanel 替代
|
|
9
|
+
- **何时用**:录入 / 编辑弹窗或页面的表单主体——需要完整提交管线 + 操作区
|
|
10
|
+
- **何时不用**:纯查询 / 搜索用 `FormSearch`;仅录入无提交操作区用 `FormMain`;只要一个提交按钮(无面板壳)用 `FormSubmitBtn` 挂 FormMain
|
|
11
|
+
- 与 FormMain 的差异:`data` 被 Omit——表单值由 `stringifyData` 初值内部管理(优先 `parseFormData` 回填,否则 `generateFormData` 初始化),消费方不持有 data
|
|
12
|
+
- 内置组合:`FormSubmitBtn`(提交按钮,validate → stringify → submitFn → loading 管线);`inheritAttrs: false`,attrs 转发内层 FormMain
|
|
13
|
+
|
|
14
|
+
## 快速上手(最小可用)
|
|
15
|
+
|
|
16
|
+
单面板最小形态(list + stringifyData 回填 + submitFn + 成功 / 失败回调即完整):
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<FormSubmitPanel :list="list" :stringifyData="seed" :submitFn="submitFn"
|
|
20
|
+
@success="onSuccess" @fail="onFail" />
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**要点**:
|
|
24
|
+
|
|
25
|
+
- `submitFn` 收 `stringifyData` 返回 Promise——提交成功后 `@success` 直接透传同一 `stringifyData` 载荷(新增 / 编辑区分由消费方按上下文定)
|
|
26
|
+
- `stringifyData` 作初值:回填数据直接给序列化形态,面板内部消化解析 / 初始化(不传则 `generateFormData(list)` 初始化)
|
|
27
|
+
- 校验 → 序列化 → 提交 → loading 管线内置,消费方零接线;`@parse-data-change` 回传内部解析模型(如 reset 后),供外部联动
|
|
28
|
+
|
|
29
|
+
## 能力边界 / 按需使用
|
|
30
|
+
|
|
31
|
+
- **默认即够用:`list` + `submitFn` + `@success` / `@fail` 即为完整提交面板**(无回填时 `stringifyData` 可省,内部 `generateFormData` 初始化)。
|
|
32
|
+
- `cancelBtn` / `resetBtn`:默认未设 = 不展示;仅当需要取消 / 重置操作才设按钮文字(按钮顺序固定:取消 → 重置 → 提交)。
|
|
33
|
+
- `operationPosition`:默认 `bottom-center` 即够用;仅当面板布局需要(如页内表单放右下)才改。
|
|
34
|
+
- `operationAffix`:默认关;仅当长表单提交区需要吸底固定才开(`true`=吸底 `position: "bottom"`,对象=ElAffix 原样透传)。
|
|
35
|
+
- `submitBtnProps`:默认 primary 即够用;仅当需改提交按钮形态(size / 其他 ButtonProps)才设。
|
|
36
|
+
- `#cancelBtn` / `#resetBtn` / `#submitBtn` 三插槽:默认关;仅当按钮需完全自定义时开(`#submitBtn` 接内置校验 + 序列化 + 提交管线)。
|
|
37
|
+
- `divider` / `bare` / `rootClass`:默认即够用;仅当面板视觉定制(去分割线 / 去内边距 / 根类定向)才动。
|
|
38
|
+
- **完整能力演示**(操作区三态 + 插槽替换 + 图钉):`apps/reference/src/pages/form/submit-panel/showcase/`——能力展示,非推荐默认。
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
42
|
+
|
|
43
|
+
### Props(泛型 `PO` 解析 / `SO` 格式化,`FormSubmitPanelProps<PO, SO>` = `Omit<FormMainProps, "data">` + 提交相关)
|
|
44
|
+
|
|
45
|
+
| name | type | 默认 | 语义 |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| `list` | `FormItemConfigList`(必填) | — | 透传 FormMain |
|
|
48
|
+
| `layout` | `Partial<ColProps>` | `{span: 24}` | 透传(默认单列) |
|
|
49
|
+
| `rowGutter` / `layoutScale` | 同 FormMain | — | 已声明 prop 不入 attrs 且未显式转发——**实际被丢弃**(layoutScale / layoutByContainer 均不生效) |
|
|
50
|
+
| `stringifyData` | `ExcludeNeverProperties<ExtractFormStringifyRawFromObject<PO, SO>>` | 未设 | 序列化数据作初值(优先 `parseFormData` 回填,否则 `generateFormData` 初始化) |
|
|
51
|
+
| `submitText` | `string` | 未设 | 提交按钮文本 |
|
|
52
|
+
| `submitFn` | `(stringifyData) => Promise<unknown>`(必填) | — | 提交方法 |
|
|
53
|
+
| `submitBtnProps` | `Omit<FormSubmitBtnProps, "submitText" \| "submitFn" \| "formMainInstance">` | 未设 | 内置 FormSubmitBtn 的额外 ButtonProps(如 `{ type: 'primary' }`) |
|
|
54
|
+
| `labelPosition` | `"right" \| "left" \| "top"` | `"right"` | 标签位置 |
|
|
55
|
+
| `labelWidth` | `string` | `"auto"` | 标签宽度 |
|
|
56
|
+
| `cancelBtn` | `string` | 未设 | 取消按钮文字(空则不展示;同名插槽优先) |
|
|
57
|
+
| `resetBtn` | `string` | 未设 | 重置按钮文字(警告色;同名插槽优先) |
|
|
58
|
+
| `operationPosition` | `"bottom-center" \| "bottom-right" \| "top-right"` | `"bottom-center"` | 操作区位置 |
|
|
59
|
+
| `operationAffix` | `boolean \| AffixProps` | `false` | 操作区图钉(`true`=吸底 `position: "bottom"`;对象=原样透传 ElAffix) |
|
|
60
|
+
| `divider` | `boolean` | `true` | 操作区分隔线 + 圆角 |
|
|
61
|
+
| `bare` | `boolean` | `false` | 去操作区内边距(与 divider 正交) |
|
|
62
|
+
| `rootClass` | `string \| string[] \| Record<string, boolean>` | 未设 | 根面板自定义 class(`inheritAttrs: false` 下 class 会透传内层 FormMain,本 prop 是显式根出口) |
|
|
63
|
+
|
|
64
|
+
### Emits
|
|
65
|
+
|
|
66
|
+
| 事件 | 载荷 | 语义 |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| `cancel` | — | 取消触发 |
|
|
69
|
+
| `fail` | `error: any` | 提交失败(submitFn reject) |
|
|
70
|
+
| `success` | `FormDataInfo["stringifyData"]` | 提交成功(submitFn resolve,透传 stringifyData 载荷) |
|
|
71
|
+
| `parseDataChange` | `PO` | 内部 parseData 变化(reset 只内部 set parseData,经此事件通知外部) |
|
|
72
|
+
|
|
73
|
+
### Slots
|
|
74
|
+
|
|
75
|
+
| 槽 | scope | 语义 |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `#cancelBtn` | `{ cancel }` | 替换取消按钮(cancelBtn 为空时也可经此插自定义取消) |
|
|
78
|
+
| `#resetBtn` | `{ reset }` | 替换重置按钮 |
|
|
79
|
+
| `#submitBtn` | `{ submit, submitting }` | 替换提交按钮(接内置校验 + 序列化 + 提交管线,可全替换按钮) |
|
|
80
|
+
| `#<config.key>` | FormItem 内部 mainProps | 覆盖单项(透传 FormMain) |
|
|
81
|
+
|
|
82
|
+
### Expose
|
|
83
|
+
|
|
84
|
+
无(表单实例内置,不对外暴露 ref 方法)。
|
|
85
|
+
|
|
86
|
+
## 反模式 / 注意
|
|
87
|
+
|
|
88
|
+
- **外部传 `data`**:类型已 Omit(`Omit<FormMainProps, "data">`)——表单值由 `stringifyData` 初值内部管理,外部回填走 `stringifyData`,联动走 `@parse-data-change`
|
|
89
|
+
- **`layoutByContainer` / `layoutScale` 无效**:已声明 prop 不入 attrs 且未显式转发——确定不生效;容器断点场景用 FormMain 或 FormSearch(其 layoutByContainer 显式转发)
|
|
90
|
+
- **手工拼提交载荷**:`submitFn` 收的即是序列化形态,`@success` 同载荷透传——提交 / 回传 / 回填三段共用同一 `stringifyData`,勿在中间自造转换
|
|
91
|
+
- **reset 语义**:reset 只内部 set parseData(回到初值快照,初值来自 `stringifyData` 或缺省 `generateFormData`),非清空到空白——需要空白态直接重给 `stringifyData`
|
|
92
|
+
|
|
93
|
+
## 关联
|
|
94
|
+
|
|
95
|
+
- 表单族:`FormMain`(底座)、`FormSubmitBtn`(内置提交按钮,经 `submitBtnProps` 定制)、`FormSearch`(搜索面)
|
|
96
|
+
- 类型:`FormDataInfo<PO, SO>` = `{ parseData, stringifyData }`(success / parseDataChange 载荷);`ExtractFormStringifyRawFromObject`(类型级提取)
|
|
97
|
+
- 范式页:`apps/reference/src/pages/form/submit-panel/showcase/`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# list-page 列表族
|
|
2
|
+
|
|
3
|
+
单组件族:`ListPage` =「FormSearch + TableMain」组合页,一个组件承接搜索、列表、分页、工具栏、粘性吸附全链路;双子 props 扁平化 + 常用项提升直属。
|
|
4
|
+
|
|
5
|
+
## 组件文档(docs/)
|
|
6
|
+
|
|
7
|
+
- [ListPage](./docs/README-ListPage.md) — 列表页(表单侧 / 表格侧双子配置 + injectInfo 注入 + 三件套粘性)
|
|
8
|
+
|
|
9
|
+
## 关键类型
|
|
10
|
+
|
|
11
|
+
- `ListPageProps` / `ListPageInstance`(= FormSearchInstance + TableMainInstance + update)/ `ListPageInnerInjectInfo`(列插槽注入:triggerSearch / triggerReset / update)
|
|
12
|
+
- 内部不导出:`use-sticky`
|
|
13
|
+
|
|
14
|
+
## 范式页(apps/reference)
|
|
15
|
+
|
|
16
|
+
- `/list-page/guide`(最佳实践:搜索 + 弹窗 CRUD + 分离侧栏)/ `/list-page/sticky`(三件套粘性)/ `/list-page/module-demo`(keepAlive 模块组合)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# ListPage(列表页)
|
|
2
|
+
|
|
3
|
+
> 「FormSearch + TableMain」组合页:一个组件承接搜索、列表、分页、工具栏、粘性吸附全链路。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/list-page/guide/`(最佳实践)、`pages/list-page/sticky/`(粘性)、`pages/list-page/module-demo/`(keepAlive 模块组合)
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **空间一等公民**:列表空间首选(搜索 + 表格 + 分页 + 粘性全链路),常规列表页 [MUST] 用它
|
|
9
|
+
- **何时用**:标准列表页(搜索 + 表格 + 分页 + 操作列),是最常用页面骨架
|
|
10
|
+
- **何时不用**:纯表格(无搜索)用 `TableMain`;纯搜索表单用 `FormSearch`
|
|
11
|
+
- 内部组合:`FormSearch`(搜索区)+ `TableMain`(表格区),props 按「表单侧 / 表格侧」双子配置扁平化,常用项提升为直属 prop
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
配置面(`guide/config.tsx` 范式 A 摘要——标准列表页最低配置,默认行为即够用):
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
const listPageConfig = {
|
|
19
|
+
api: userListApi, // 列表取数(TableApiParams / TableApiResult 契约)
|
|
20
|
+
list: userSearchFormList, // 搜索表单配置(FormItemConfigList)
|
|
21
|
+
columns, // 列配置(ElTableColumnProps 超集,render 三态)
|
|
22
|
+
rowKey: "id",
|
|
23
|
+
injectInfo, // 自定义只读上下文,列 render 里 scope.injectInfo 消费
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
挂载 + 注入触发(`module-demo/list/Index.vue` 最小闭环):
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { ListPage } from "@done-coding/admin-core";
|
|
31
|
+
import type { ListPageInstance } from "@done-coding/admin-core";
|
|
32
|
+
const listPage = ref<ListPageInstance>();
|
|
33
|
+
const { listPageConfig } = useSpaceConfig({
|
|
34
|
+
goDetail: (id?: number) =>
|
|
35
|
+
router.push({ path: "/list-page/module-demo/detail",
|
|
36
|
+
query: id === undefined ? {} : { id: String(id) } }),
|
|
37
|
+
reloadList: () => listPage.value?.reload(), // 增删改成功后触发
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<AppPage>
|
|
43
|
+
<ListPage ref="listPage" v-bind="listPageConfig" />
|
|
44
|
+
</AppPage>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**要点**:
|
|
48
|
+
|
|
49
|
+
- `staticQuery` 是扁平 prop,**禁放 `formSearchProps` 内**(类型已 Omit)
|
|
50
|
+
- keepAlive 返回刷新由 core 内置承担(TableMain onActivated 自动 refresh 留页码)——**[MUST NOT]** app 侧再手写刷新信号补偿(双重请求反模式)
|
|
51
|
+
|
|
52
|
+
## 能力边界 / 按需使用
|
|
53
|
+
|
|
54
|
+
- **`toolbar`(工具栏):默认无即够用。** 仅当需要新增 / 批量删除等操作按钮才配 `leftExtraButtons`(ActionBtnGroup 配置形态);操作依赖选中行时经 `ctx.selectedList` 联动 disabled。
|
|
55
|
+
- **`separateSearch`(分离侧栏):默认关(搜索在表格上方一体布局)。** 仅当搜索项多、需「搜索独立侧栏 + 主区纯表格」才开——开启后 header/搜索/操作区整体入侧栏,aside 与表格 maxHeight 同源;⚠️ 分离态下 `searchSticky` 被无视。
|
|
56
|
+
- **`searchSticky` / `toolbarSticky` / `pagerSticky`(三件套粘性):默认全关。** 仅当页面长滚时需搜索 / 工具栏 / 分页吸附才按需开(toolbarSticky 叠钉搜索区下方)。
|
|
57
|
+
- **`showSwitchView`(双视图切换):默认关(表格单一视图)。** 仅当需要「列表 / 卡片」双视图切换才开(配 `#custom-view-item` 卡片渲染)。
|
|
58
|
+
- **`isAutoRefresh` / `refreshInterval`:默认关(不自动刷新)。** 仅当列表需轮询刷新(任务态实时变化等)才开。
|
|
59
|
+
- **高度链 prop(`refine` / `viewportHeight` / `parentChannel`):默认 ListPage 内部已接管**(refine 默认 true)——常规无需干预,仅特殊高度场景覆写。
|
|
60
|
+
- **完整能力演示**(toolbar 全形态 + 粘性三件套 + keepAlive 组合):`apps/reference/src/pages/list-page/guide/`(最佳实践)、`pages/list-page/sticky/`(粘性)、`pages/list-page/module-demo/`(keepAlive 模块组合)——能力展示,非推荐默认。
|
|
61
|
+
|
|
62
|
+
## API
|
|
63
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
64
|
+
|
|
65
|
+
### Props(泛型 `T` 行 / `PO` 解析 / `SO` 格式化 / `SQ` 静态 / `F` 注入)
|
|
66
|
+
|
|
67
|
+
**表单侧(FormSearch 双子)**
|
|
68
|
+
|
|
69
|
+
| name | type | 默认 | 语义 |
|
|
70
|
+
| --- | --- | --- | --- |
|
|
71
|
+
| `list` | `FormItemConfigList<PO, SO>` | `[]` | 搜索表单配置(ListPage 据此推 PO/SO,data 内部生成) |
|
|
72
|
+
| `staticQuery` | `SQ` | `{}` | 静态参数(扁平顶到 ListPage,禁放 formSearchProps 内) |
|
|
73
|
+
| `formSearchProps` | `Partial<Omit<FormSearchProps<PO,SO,{}>, "staticQuery"\|"list"\|"compact">>` | 未设 | FormSearch 透传袋(compact 由内部 separateSearch 驱动,外部 [MUST NOT] 覆盖) |
|
|
74
|
+
|
|
75
|
+
**表格侧(TableMain 双子)**
|
|
76
|
+
|
|
77
|
+
| name | type | 默认 | 语义 |
|
|
78
|
+
| --- | --- | --- | --- |
|
|
79
|
+
| `columns` | `TableMainProps["columns"]`(必填) | — | 列配置(扁平等级) |
|
|
80
|
+
| `rowKey` | `Extract<keyof T, string> \| ((row:T)=>string)`(必填) | — | 行键 |
|
|
81
|
+
| `api` | `(params: TableApiParams<ExtractFormStringifyFromObject<PO,SO> & SQ>) => Promise<TableApiResult<T>>`(必填) | — | 列表取数 |
|
|
82
|
+
| `refine` / `refineReduceHeight` / `viewportHeight` / `parentChannel` / `toolbar` / `showSwitchView` | 同 TableMain | refine `true`、refineReduceHeight `0` | 常用配置提升为直属扁平 prop(内部自行消化视口高度链;TableMain 恒收 `:refine="false"`,高度计算由 ListPage 接管) |
|
|
83
|
+
| `tableMainProps` | `Partial<Omit<TableMainProps, 上述 6 键 \| "api" \| "query" \| "injectInfo">>` | 未设 | TableMain 透传袋 |
|
|
84
|
+
|
|
85
|
+
**直属行为 props**
|
|
86
|
+
|
|
87
|
+
| name | type | 默认 | 语义 |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| `query` | `SQ` | — | ⚠️ types 声明但组件内未消费(疑似历史残留),勿依赖 |
|
|
90
|
+
| `injectInfo` | `F` | 未设 | 自定义只读上下文,合并进列插槽 scope.injectInfo(只读消费通道) |
|
|
91
|
+
| `beforeSearch` | `(data, type) => data` | 未设 | 搜索前同步回调(可改写参数) |
|
|
92
|
+
| `clearTableFilterOnReset` | `boolean` | 未设 | 重置时同时清空表头过滤 |
|
|
93
|
+
| `separateSearch` | `boolean` | `false` | 搜索/header/操作区整体移入侧栏 |
|
|
94
|
+
| `separateSearchConfig` | `Pick<SlotLayoutFlowAsideProps, "type"\|"gap"\|"asideWidth">` | 未设 | 分离侧栏布局 |
|
|
95
|
+
| `searchSticky` / `toolbarSticky` / `pagerSticky` | `boolean` | 均 `false` | 三件套粘性(分离态下 searchSticky 被无视) |
|
|
96
|
+
| `headerObserveResize` / `operationObserveResize` | `boolean` | 均 `false` | header/操作槽量高 ResizeObserver |
|
|
97
|
+
|
|
98
|
+
**v-model**:`isAutoRefresh`、`refreshInterval`、`customView`(配合 `#custom-view-item` 卡片渲染)
|
|
99
|
+
|
|
100
|
+
### Emits
|
|
101
|
+
|
|
102
|
+
| 事件 | 载荷 | 语义 |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| `dataChange` | `T[]` | 数据变更 |
|
|
105
|
+
| `pageInfoChange` | `TablePageInfo` | 分页信息(pageSize/currentPage/total) |
|
|
106
|
+
|
|
107
|
+
### Slots
|
|
108
|
+
|
|
109
|
+
| 槽 | scope | 语义 |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
| `#header` / `#operation` | 无 | 搜索区上下扩展 |
|
|
112
|
+
| `#custom-view-item` | `DataListViewItemScope<T>` | customView 模式单项卡片渲染 |
|
|
113
|
+
| `#form-<key>` | `FormScope` | 覆盖搜索表单单项 |
|
|
114
|
+
| `#table-<prop>` | `TableColumnDefaultScope<T, ListPageInnerInjectInfo<PO,F>>` | 覆盖列单元格 |
|
|
115
|
+
| `#table-header-<prop>` | `TableColumnHeaderScope & { searchFormData: PO; triggerSearch?: () => void }` | 覆盖列表头(可联动搜索) |
|
|
116
|
+
|
|
117
|
+
### Expose(`ListPageInstance` = FormSearchInstance + TableMainInstance + update)
|
|
118
|
+
|
|
119
|
+
`refresh(silent?)` / `reload(silent?)` / `getTableInstance()` / `validate()` / `resetFields()` / `clearValidate(key?)` / `triggerReset()` / `triggerSearch()` / `toggleCollapse(next?)` / `isCollapsed` / `update(key, value)`(改内部表单数据)
|
|
120
|
+
|
|
121
|
+
**注入机制**:`injectInfoAdjust` 把 `triggerReset` / `triggerSearch` / `update` 合并进 TableMain `:injectInfo` —— 列插槽 `scope.injectInfo` 可直接 `triggerSearch()` / `triggerReset()` / `update(key, value)`(类型 `ListPageInnerInjectInfo<PO,F>`)。
|
|
122
|
+
|
|
123
|
+
## 反模式 / 注意
|
|
124
|
+
|
|
125
|
+
- **搜索表单用 FormSearch 的 `#default`**:被内置按钮盒占用,消费方默认插槽不渲染
|
|
126
|
+
- **`query` prop 勿用**:声明未消费(疑似历史残留)
|
|
127
|
+
- **keepAlive 页返回刷新**:core 内置(onActivated refresh 留页码),app 侧 [MUST NOT] 补偿
|
|
128
|
+
- **formSearchProps 塞 staticQuery/compact**:类型已 Omit,编译即拦
|
|
129
|
+
- 搜索/表格的双子 props 与 TableMain 直属 prop 重复时,**以 ListPage 直属为准**(TableMain 恒收 refine=false)
|
|
130
|
+
|
|
131
|
+
## 关联
|
|
132
|
+
|
|
133
|
+
- 内部组件:`FormSearch`(form 族)、`TableMain`(table 族)
|
|
134
|
+
- 列表接口模型:`APP_API_LIST_MODEL_KEY_CONFIG`(core config 单源,api 参数/结果类型由它推导)
|
|
135
|
+
- 高度链:`refine` + `viewportHeight`/`parentChannel`(见 TableMain 文档)
|
|
136
|
+
- 范式页:`apps/reference/src/pages/list-page/guide/`、`pages/list-page/sticky/`、`pages/list-page/module-demo/`
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# menu 菜单族
|
|
2
|
+
|
|
3
|
+
配置化菜单族:`MenuTree`(基于 ElMenu 的树形菜单)+ `MenuItemSub`(递归子菜单分组件,MenuTree 内部递归用)。
|
|
4
|
+
|
|
5
|
+
## 组件文档(docs/)
|
|
6
|
+
|
|
7
|
+
- [MenuTree](./docs/README-MenuTree.md) — 树形菜单(menus 递归出 ElSubMenu + routerMode / autoClose / collapse + open/close expose)
|
|
8
|
+
- [MenuItemSub](./docs/README-MenuItemSub.md) — 递归子菜单分组件(ElSubMenu 递归节点,一般由 MenuTree 自用)
|
|
9
|
+
|
|
10
|
+
## 关键类型
|
|
11
|
+
|
|
12
|
+
- `RouteMetaResolveRaw`(@/types,menus / menuFlatList 数据契约)
|
|
13
|
+
- 内部不导出:无(MenuTree / MenuItemSub 均进 core 顶层,无 types.ts)
|
|
14
|
+
|
|
15
|
+
## 范式页(apps/reference)
|
|
16
|
+
|
|
17
|
+
- 真实消费方:`AppSidebar`(packages/core/src/components/app-layout/AppSidebar.vue)——生产级驱动点
|
|
18
|
+
- 菜单数据契约范式:`apps/reference/src/router/modules/test.ts`(meta.menu 的 show / icon / sort 驱动渲染与排序)
|
|
19
|
+
- 注意:`/menu/showcase/Page1/2/3` 是菜单渲染出的叶子路由页,不是 MenuTree 的用法示范
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# MenuItemSub(递归子菜单分组件)
|
|
2
|
+
|
|
3
|
+
> ElSubMenu 递归分组:含 children 的节点递归渲染子菜单、叶子渲染 ElMenuItem;由 MenuTree 递归自用。
|
|
4
|
+
> 范式页:`packages/core/src/components/menu/MenuTree.vue`(内部消费方)
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- 递归子菜单分组件:节点含 `children` → `ElSubMenu` + 递归子级;叶子 → `ElMenuItem`
|
|
9
|
+
- 组件自引用:`MenuItemSub` prop 传入组件自身,供 children 递归再实例化
|
|
10
|
+
- 一般由 `MenuTree` 内部使用,独立消费场景少见
|
|
11
|
+
|
|
12
|
+
## 快速上手(最小可用)
|
|
13
|
+
|
|
14
|
+
MenuTree 内部驱动(menu/MenuTree.vue 片段):
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<MenuItemSub :menu="menu!" :MenuItemSub="MenuItemSub" />
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 能力边界 / 按需使用
|
|
21
|
+
|
|
22
|
+
- **内部递归件,勿直用:MenuTree 递归自用的分组件,独立消费场景少见。** 业务侧 [MUST NOT] 直接 import 消费——children 递归靠 `MenuItemSub` prop 自引用再实例化,仅由 MenuTree 内部驱动。
|
|
23
|
+
|
|
24
|
+
## API
|
|
25
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
26
|
+
|
|
27
|
+
### Props
|
|
28
|
+
|
|
29
|
+
| name | type | 默认 | 语义 |
|
|
30
|
+
| --- | --- | --- | --- |
|
|
31
|
+
| `menu` | `RouteMetaResolveRaw`(必填) | — | 当前分组节点 |
|
|
32
|
+
| `MenuItemSub` | `any`(必填) | — | 组件自引用,供 children 递归再实例化 |
|
|
33
|
+
|
|
34
|
+
### Emits
|
|
35
|
+
|
|
36
|
+
无
|
|
37
|
+
|
|
38
|
+
### Slots
|
|
39
|
+
|
|
40
|
+
无(ElSubMenu 标题与子项均由 menu 数据驱动)
|
|
41
|
+
|
|
42
|
+
### Expose
|
|
43
|
+
|
|
44
|
+
无
|
|
45
|
+
|
|
46
|
+
## 反模式 / 注意
|
|
47
|
+
|
|
48
|
+
- **缺自引用 prop**:children 递归靠 `MenuItemSub` prop 再实例化,缺它无法递归展开子级
|
|
49
|
+
|
|
50
|
+
## 关联
|
|
51
|
+
|
|
52
|
+
- 消费方:`MenuTree`(menu 族)
|
|
53
|
+
- 数据契约:`RouteMetaResolveRaw`(@/types)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# MenuTree(树形菜单)
|
|
2
|
+
|
|
3
|
+
> 基于 ElMenu 的配置化树形菜单:menus 树形数据递归出 ElSubMenu,叶子渲染 ElMenuItem;routerMode 路由联动、autoClose 选中收合、collapse 折叠透传。
|
|
4
|
+
> 范式页:真实消费方为 `AppSidebar`(packages/core/src/components/app-layout/AppSidebar.vue);菜单数据契约范式见 `apps/reference/src/router/modules/test.ts`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:侧栏 / 导航需要配置驱动的树形菜单(递归子菜单、路由联动、折叠态)
|
|
9
|
+
- **何时不用**:单层 / 少量菜单直接用 ElMenu;菜单数据不来自路由配置时自行组装数据再接入
|
|
10
|
+
- 数据驱动:`menus` 树形节点含 `children` 递归出 `ElSubMenu`,叶子渲染 `ElMenuItem`;`menuFlatList` 拍平列表供 autoClose 沿 `parentPath` 递归算父链
|
|
11
|
+
- 增强点:routerMode(defaultActive 取 route.path + ElMenu :router)、autoClose(选中一项收合其它展开子菜单)、collapse 透传、ElMenu 其余 attrs 整包透传、open / close expose
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
必填只有 `menus` + `menuFlatList`——默认 ElMenu 主题、无路由联动、无选中收合:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<MenuTree :menus="menus" :menuFlatList="menuFlatList" />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**要点**:
|
|
22
|
+
|
|
23
|
+
- `menus` 必填:树形菜单数据;含 `children` 的节点递归出 `ElSubMenu`
|
|
24
|
+
- `menuFlatList` 必填:拍平列表,autoClose 时沿 `parentPath` 算父链
|
|
25
|
+
- 菜单数据契约(范式 `apps/reference/src/router/modules/test.ts`):`meta.menu` 的 `show` / `icon` / `sort` 驱动渲染与排序;`/menu/showcase/page1|page3|page2` 三级嵌套演示递归子菜单,`sort` 1/2/3 演示排序
|
|
26
|
+
|
|
27
|
+
## 能力边界 / 按需使用
|
|
28
|
+
|
|
29
|
+
- **`routerMode`:默认关即够用。** 仅当菜单项与路由 path 联动高亮才开——开启后 `defaultActive` 自动取 `route.path`(useRoute)+ ElMenu `:router` 同步开启;注意依赖 vue-router 上下文。
|
|
30
|
+
- **`autoClose`:默认关即够用。** 仅当「选中一项后收合其它展开子菜单」才开——父链沿 `menuFlatList` 的 `parentPath` 递归计算,数据缺失时路径链断裂、收合不全。
|
|
31
|
+
- **`collapse`:默认不折叠即够用。** 仅当侧栏折叠态需要同步收起菜单才传(透传 ElMenu)。
|
|
32
|
+
- **颜色 attrs(`background-color` / `text-color` / `active-text-color` 等):默认 ElMenu 主题即够用。** 仅当需贴合页面主题配色才显式传。
|
|
33
|
+
- **完整能力演示**(生产级驱动点 = AppSidebar 内部接线,含折叠 + 路由联动 + 主题配色):`packages/core/src/components/app-layout/AppSidebar.vue`——能力展示,非推荐默认。
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
37
|
+
|
|
38
|
+
### Props
|
|
39
|
+
|
|
40
|
+
| name | type | 默认 | 语义 |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| `menus` | `RouteMetaResolveRaw[]`(必填) | — | 树形菜单数据;含 children 的节点递归出 ElSubMenu |
|
|
43
|
+
| `menuFlatList` | `RouteMetaResolveRaw[]`(必填) | — | 拍平列表,autoClose 时沿 parentPath 算父链 |
|
|
44
|
+
| `routerMode?` | `boolean` | 未设 | 路由模式:true 时 defaultActive 取 route.path(useRoute)+ ElMenu :router 开启 |
|
|
45
|
+
| `collapse?` | `boolean` | 未设 | 折叠态透传 ElMenu |
|
|
46
|
+
| `autoClose?` | `boolean` | 未设 | 选中一项后关闭其它展开的 ElSubMenu |
|
|
47
|
+
|
|
48
|
+
其余 attrs(`background-color` / `text-color` / `active-text-color` 等 ElMenu props)整包透传。
|
|
49
|
+
|
|
50
|
+
### Emits
|
|
51
|
+
|
|
52
|
+
无显式 defineEmits。模板 `v-bind="attrs"` 先展开、`@select` 后声明——外部 `onSelect` 无法覆盖内部 autoClose 逻辑(推断标注)。
|
|
53
|
+
|
|
54
|
+
### Slots
|
|
55
|
+
|
|
56
|
+
无(ElMenu default slot 被 menus v-for 占用)。
|
|
57
|
+
|
|
58
|
+
### Expose
|
|
59
|
+
|
|
60
|
+
| 方法 | 参数 | 语义 |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `open` | `index: string` | 打开指定菜单(代理 ElMenu 同名方法) |
|
|
63
|
+
| `close` | `index: string` | 关闭指定菜单(代理 ElMenu 同名方法) |
|
|
64
|
+
|
|
65
|
+
## 反模式 / 注意
|
|
66
|
+
|
|
67
|
+
- **`/menu/showcase/Page1/2/3` 当用法示范**:它们是菜单渲染出的叶子路由页;MenuTree 的真实消费方是 AppSidebar
|
|
68
|
+
- **autoClose 缺 parentPath 数据**:父链沿 `parentPath` 递归计算,数据缺失时路径链断裂、收合不全
|
|
69
|
+
- **想覆盖内部 @select**:`v-bind="attrs"` 展开在前、`@select` 声明在后,外部 `onSelect` 无法覆盖内部 autoClose 逻辑(推断标注)
|
|
70
|
+
- **依赖 vue-router 上下文**:routerMode 使用 `useRoute`,组件须在安装 vue-router 的上下文中使用
|
|
71
|
+
|
|
72
|
+
## 关联
|
|
73
|
+
|
|
74
|
+
- 内部递归:`MenuItemSub`(menu 族)
|
|
75
|
+
- 消费方:`AppSidebar`(app-layout 族)
|
|
76
|
+
- 数据契约:`RouteMetaResolveRaw`(@/types)、`apps/reference/src/router/modules/test.ts`(meta.menu show / icon / sort)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# misc 杂项族
|
|
2
|
+
|
|
3
|
+
> 单点杂项组件集合:不归属任何语义族(form / table / modal / panel…),各自独立、低耦合。
|
|
4
|
+
> 内部消费范式:`packages/core/src/components/table/TableToolbar.vue`(AutoRefreshGroup 经此服务列表页工具栏)
|
|
5
|
+
|
|
6
|
+
## 组件清单
|
|
7
|
+
|
|
8
|
+
| 组件 | 一句话 | 文档 |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| `AutoRefresh` | 自动刷新开关:开关 + 刷新间隔(秒),定时调用刷新方法 | [README-AutoRefresh](./docs/README-AutoRefresh.md) |
|
|
11
|
+
| `AutoRefreshGroup` | 工具栏组:自动刷新开关 + 手动刷新按钮 + loading 联动 + 布局根控制 | [README-AutoRefreshGroup](./docs/README-AutoRefreshGroup.md) |
|
|
12
|
+
| `SelectModule` | AppLayout 内模块下拉选择器(二级路由菜单 + 首项「全部」) | [README-SelectModule](./docs/README-SelectModule.md) |
|
|
13
|
+
| `TriggerAutoImport`(`@deprecated`) | 仅为触发 unplugin 自动导入的占位组件,永不渲染 | 不写独立文档,见下 |
|
|
14
|
+
|
|
15
|
+
`types.ts` 导出 `AutoRefreshProps` / `AutoRefreshGroupProps`;族 index.ts 导出 `{ AutoRefresh, AutoRefreshGroup, SelectModule, TriggerAutoImport }`,均进 core 顶层。
|
|
16
|
+
|
|
17
|
+
## TriggerAutoImport(@deprecated)
|
|
18
|
+
|
|
19
|
+
- 模板 `<slot v-if="showSlot">` 且 `showSlot` 恒 `false`——**永不渲染**,用途仅为触发 unplugin 自动导入(按需样式)
|
|
20
|
+
- index.ts 导出处 JSDoc:全局样式引入后已无用——`main.ts` `import "element-plus/dist/index.css"` + `ElementPlusResolver importStyle: false` 即可;下个 MAJOR 删除
|
|
21
|
+
- 全仓零消费者;新代码 [MUST NOT] 引入
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# AutoRefresh(自动刷新开关)
|
|
2
|
+
|
|
3
|
+
> 独立自动刷新开关:开关 + 刷新间隔(秒),按间隔定时调用刷新方法。
|
|
4
|
+
> 消费范式:core 内无直接使用点,列表/表格场景经 `AutoRefreshGroup` 使用——内部消费者 `packages/core/src/components/table/TableToolbar.vue`(经 AutoRefreshGroup)即范例。
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:需要「按间隔自动刷新」的独立开关(不跟随工具栏整体布局的场景)
|
|
9
|
+
- **何时不用**:列表/表格工具栏场景用 `AutoRefreshGroup`(自动刷新 + 手动刷新 + loading + 布局根一次拿齐)
|
|
10
|
+
- 内部组合:`ElPopover`(hover) + `ElSwitch` + `ElInputNumber`
|
|
11
|
+
- 刷新失败被 catch,不影响下轮定时
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
直接使用场景较少;典型用法是经 `AutoRefreshGroup` 组合进工具栏(见 [README-AutoRefreshGroup](./README-AutoRefreshGroup.md))。单独使用即开关 + 间隔双向绑定:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<AutoRefresh v-model="open" v-model:interval="interval" />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const open = ref(false); // 开关(modelValue)
|
|
23
|
+
const interval = ref(5); // 刷新间隔,秒(v-model:interval)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**要点**:
|
|
27
|
+
|
|
28
|
+
- `v-model` = 开关(modelValue);`v-model:interval` = 间隔秒数
|
|
29
|
+
- `refreshFn` 返回 Promise,失败被 catch——**不会**中断下轮定时
|
|
30
|
+
- 防并发:`doRefresh` 未结算前重入共享同一 promise,不并发发请求
|
|
31
|
+
- 激活语义:mounted 只 schedule 不立即刷新;仅 keep-alive 重激活(`triggerType === "activated"`)才立即刷新
|
|
32
|
+
|
|
33
|
+
## 能力边界 / 按需使用
|
|
34
|
+
|
|
35
|
+
- **直接使用 vs 走 `AutoRefreshGroup`:独立开关场景才直接用本组件。** 判据——只要「开关 + 刷新间隔」本身、不跟随工具栏整体布局;列表/表格工具栏场景 [MUST] 走 `AutoRefreshGroup`(自动刷新 + 手动刷新 + loading + 布局根一次拿齐,手拼两组件属重复造轮)。
|
|
36
|
+
- **`refreshFn` 必填**:无刷新方法组件无意义——返回 Promise,失败被 catch 吞掉、不影响下轮定时,业务需感知失败请在 `refreshFn` 内自行处理。
|
|
37
|
+
- **`disabled`:默认 `undefined`(开关正常可用)即够用。** 仅当「禁用自动刷新」(置 `true` 即 `openRefresh=false`:清 timer 且不排下轮)才设——注意不是灰化开关。
|
|
38
|
+
- **完整能力演示**(组合进表格工具栏的标准接线):`packages/core/src/components/table/TableToolbar.vue`(经 AutoRefreshGroup)——能力展示,非推荐默认。
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
42
|
+
|
|
43
|
+
### Props
|
|
44
|
+
|
|
45
|
+
| name | type | 默认 | 语义 |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| `refreshFn` | `() => Promise<unknown>`(必填) | 无 | 刷新方法;失败被 catch,不影响下轮定时 |
|
|
48
|
+
| `disabled` | `boolean` | `undefined` | `true` 时 `openRefresh=false`:清 timer 且不排下轮 |
|
|
49
|
+
|
|
50
|
+
**v-model**:`modelValue: boolean`(默认 `false`,开关,`v-model`);`interval: number`(默认 `5`,秒,`v-model:interval`)
|
|
51
|
+
|
|
52
|
+
### Emits
|
|
53
|
+
|
|
54
|
+
无
|
|
55
|
+
|
|
56
|
+
### Slots
|
|
57
|
+
|
|
58
|
+
无
|
|
59
|
+
|
|
60
|
+
### Expose
|
|
61
|
+
|
|
62
|
+
无
|
|
63
|
+
|
|
64
|
+
## 反模式 / 注意
|
|
65
|
+
|
|
66
|
+
- **`disabled` 不是灰化开关**:置 `true` 即 `openRefresh=false`(清 timer 且不排下轮),而非仅置灰不可点
|
|
67
|
+
- **刷新失败勿在组件外兜**:失败被 catch 吞掉,业务需感知失败请在 `refreshFn` 内自行处理
|
|
68
|
+
- **工具栏场景勿直接拼**:自动刷新 + 手动刷新成套能力(loading/布局根联动)在 `AutoRefreshGroup`,手拼两组件属重复造轮
|
|
69
|
+
|
|
70
|
+
## 关联
|
|
71
|
+
|
|
72
|
+
- 组合形态:`AutoRefreshGroup`(misc 族)
|
|
73
|
+
- 内部消费者:`TableToolbar`(table 族,经 AutoRefreshGroup)
|
|
74
|
+
- 激活语义:`useActivated`(core hooks)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# AutoRefreshGroup(工具栏自动刷新组)
|
|
2
|
+
|
|
3
|
+
> 「自动刷新开关 + 手动刷新按钮」组合组:loading 联动、布局根可选,表格工具栏自动刷新能力即此组件。
|
|
4
|
+
> 消费范式:`packages/core/src/components/table/TableToolbar.vue`(内部代表消费);列表页经 TableMain/ListPage 工具栏生效。
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:工具栏/操作区需要「自动刷新开关 + 手动刷新按钮」成套能力
|
|
9
|
+
- **何时不用**:只要自动刷新开关(不要手动按钮/布局控制)用 `AutoRefresh`
|
|
10
|
+
- 组合:`AutoRefresh`(开关本体)+ 手动刷新按钮 + loading 联动 + 布局根控制;`refreshFn` 等核心 props 透传 `AutoRefresh`
|
|
11
|
+
|
|
12
|
+
## 快速上手(最小可用)
|
|
13
|
+
|
|
14
|
+
必填 `refreshFn` + 两个 v-model——开关 + 间隔 + 手动刷新一次拿齐:
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<AutoRefreshGroup
|
|
18
|
+
v-model:isAutoRefresh="isAutoRefresh"
|
|
19
|
+
v-model:interval="refreshInterval"
|
|
20
|
+
:refreshFn="tableExpose.refresh"
|
|
21
|
+
/>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**要点**:
|
|
25
|
+
|
|
26
|
+
- `v-model:isAutoRefresh` = 自动刷新开关;`v-model:interval` = 刷新间隔秒数
|
|
27
|
+
- `showAutoRefresh` / `showRefresh` 可分别关掉开关 / 按钮——如只留手动刷新
|
|
28
|
+
- `loading` 传入时:`AutoRefresh` 收 `:disabled` + 图标旋转动画(异步刷新免自管 loading)
|
|
29
|
+
|
|
30
|
+
## 能力边界 / 按需使用
|
|
31
|
+
|
|
32
|
+
- **`needRootNode`:默认 `true`(包布局根)即够用(独立使用)。** 嵌入既有布局(如表格工具栏)时 [MUST] 设 `false`——工具栏自身已是布局一部分,否则多包一层布局根(TableToolbar 标准接线即 `false`)。
|
|
33
|
+
- **`showAutoRefresh` / `showRefresh`:默认全开即够用。** 仅当只要其中一半能力才关另一半——如只留手动刷新按钮(`showAutoRefresh={false}`)。
|
|
34
|
+
- **`loading`:默认 `undefined` 即够用(不联动)。** 仅当异步刷新需要免自管 loading 态才传——传入后开关置 `disabled` + 图标旋转,[MUST NOT] 在消费方再手写 loading。
|
|
35
|
+
- **完整能力演示**(表格工具栏标准接线 = TableToolbar 内部消费):`packages/core/src/components/table/TableToolbar.vue`——能力展示,非推荐默认。
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
39
|
+
|
|
40
|
+
### Props
|
|
41
|
+
|
|
42
|
+
| name | type | 默认 | 语义 |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| `refreshFn` | `() => Promise<unknown>`(必填) | 无 | 透传 AutoRefresh |
|
|
45
|
+
| `showAutoRefresh` | `boolean` | `true` | 是否显示自动刷新开关 |
|
|
46
|
+
| `showRefresh` | `boolean` | `true` | 是否显示手动刷新按钮 |
|
|
47
|
+
| `loading` | `boolean` | `undefined` | 加载中:传入 AutoRefresh `:disabled` + 图标旋转动画 |
|
|
48
|
+
| `needRootNode` | `boolean` | `true` | 是否需要根节点(传 SlotLayoutTemplate `:disabled`,控制是否包布局根) |
|
|
49
|
+
|
|
50
|
+
**v-model**:`isAutoRefresh: boolean`(`v-model:isAutoRefresh`);`interval: number`(默认 `5`,秒,`v-model:interval`)
|
|
51
|
+
|
|
52
|
+
### Emits
|
|
53
|
+
|
|
54
|
+
无
|
|
55
|
+
|
|
56
|
+
### Slots
|
|
57
|
+
|
|
58
|
+
无
|
|
59
|
+
|
|
60
|
+
### Expose
|
|
61
|
+
|
|
62
|
+
无
|
|
63
|
+
|
|
64
|
+
## 反模式 / 注意
|
|
65
|
+
|
|
66
|
+
- **异步刷新勿自管 loading**:`refreshFn` 返回 Promise,`loading` 传入即开关置 `disabled` + 图标旋转——[MUST NOT] 在消费方再手写 loading 态
|
|
67
|
+
- **`needRootNode` 语义**:默认 `true`(传 SlotLayoutTemplate `:disabled`,包布局根);嵌入既有布局(如工具栏)时 [MUST] 设 `false`,否则多包一层布局根
|
|
68
|
+
- **工具栏场景勿手拼 AutoRefresh + ElButton**:成套能力已在此组件,重复造轮
|
|
69
|
+
|
|
70
|
+
## 关联
|
|
71
|
+
|
|
72
|
+
- 子组件:`AutoRefresh`(misc 族,开关本体)
|
|
73
|
+
- 内部消费者:`TableToolbar`(table 族)
|
|
74
|
+
- 布局根:`SlotLayoutTemplate`(slot-layout 族)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# SelectModule(模块选择器)
|
|
2
|
+
|
|
3
|
+
> AppLayout 内「路由模块」下拉选择器:二级菜单选项 + 首项固定「全部」,v-model 透传 ElSelect。
|
|
4
|
+
> 范式页:`apps/reference/src/pages/home/Home.vue`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:AppLayout 布局内需要「按路由模块切换」的下拉选择
|
|
9
|
+
- **前置**:必须挂在 `AppLayout` 内——inject `APP_LAYOUT_BRIDGE_KEY`,缺失即 throw「必须在 AppLayout 内使用」
|
|
10
|
+
- 数据源:`generateRouteMetaRawTree(getRoutes(), { filterFn: menuShow, sortFn: menuSort })`,仅二级(`ElOptionGroup`,注释明示未递归)
|
|
11
|
+
- 首项固定「全部」= `FORM_CONFIG_SELECT_ALL_VALUE`;选项 `value` = 路由 `path`
|
|
12
|
+
- **props/emits 面为空是设计使然**:无 defineProps / defineEmits / defineModel / defineExpose(`defineOptions({ name: "SelectModule", inheritAttrs: true })`),`v-model` 经 `inheritAttrs` 透传 `ElSelect`
|
|
13
|
+
|
|
14
|
+
## 快速上手(最小可用)
|
|
15
|
+
|
|
16
|
+
挂载于 AppLayout 内,单个 `v-model` 即够用:
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<SelectModule v-model="module" />
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { SelectModule } from "@done-coding/admin-core";
|
|
24
|
+
|
|
25
|
+
const module = ref<string>();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**要点**:
|
|
29
|
+
|
|
30
|
+
- `v-model` 绑定选中的路由 `path`;首项「全部」内置,无需特殊处理
|
|
31
|
+
- 挂载点必须在 `AppLayout` 内(bridge 注入契约)
|
|
32
|
+
- `inheritAttrs` 透传——ElSelect 属性(如 `placeholder`)照常传入
|
|
33
|
+
|
|
34
|
+
## 能力边界 / 按需使用
|
|
35
|
+
|
|
36
|
+
- **仅二级:选项只到路由模块一级(`ElOptionGroup`,注释明示未递归),多级菜单不承载。** 判据——模块选择器的粒度就是「切换模块」,不是全量多级菜单导航。
|
|
37
|
+
- **必须在 `AppLayout` 内使用:inject `APP_LAYOUT_BRIDGE_KEY`,缺失即 throw。** 挂载点脱离布局即报错,[MUST NOT] 在普通页面直接放。
|
|
38
|
+
- **`v-model` 经 `inheritAttrs` 透传 ElSelect:props 面为空是设计使然(透传代理组件)。** 消费方照常传 ElSelect 属性(`placeholder` 等)即生效;选项 `value` = 路由 `path`——选中值即路由路径,勿期待是模块名 / id。
|
|
39
|
+
- **完整能力演示**:`apps/reference/src/pages/home/Home.vue`——能力展示,非推荐默认。
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
43
|
+
|
|
44
|
+
### Props
|
|
45
|
+
|
|
46
|
+
无(props 面为空;`v-model` 经 `inheritAttrs` 透传 `ElSelect`,消费方照常传 ElSelect 属性)
|
|
47
|
+
|
|
48
|
+
### Emits
|
|
49
|
+
|
|
50
|
+
无(`v-model` 变更经 ElSelect 透传)
|
|
51
|
+
|
|
52
|
+
### Slots
|
|
53
|
+
|
|
54
|
+
无
|
|
55
|
+
|
|
56
|
+
### Expose
|
|
57
|
+
|
|
58
|
+
无
|
|
59
|
+
|
|
60
|
+
## 反模式 / 注意
|
|
61
|
+
|
|
62
|
+
- **[MUST NOT] 在 `AppLayout` 外使用**:inject `APP_LAYOUT_BRIDGE_KEY` 缺失即 throw
|
|
63
|
+
- **仅二级**:注释明示未递归,不期望承载全量多级菜单
|
|
64
|
+
- **无 props 面 ≠ 残缺**:透传代理组件设计使然,消费方用法即 `<SelectModule v-model="..." />`
|
|
65
|
+
- 选项 `value` 是路由 `path`——选中值即路由路径,勿期待是模块名 / id
|
|
66
|
+
|
|
67
|
+
## 关联
|
|
68
|
+
|
|
69
|
+
- 注入契约:`APP_LAYOUT_BRIDGE_KEY`(core inject,跨包 `Symbol.for`)
|
|
70
|
+
- 数据源:`generateRouteMetaRawTree`(core utils)+ 菜单显隐 / 排序 `menuShow` / `menuSort`
|
|
71
|
+
- 常量:`FORM_CONFIG_SELECT_ALL_VALUE`(「全部」值)
|
|
72
|
+
- 范式页:`apps/reference/src/pages/home/Home.vue`
|