Skip to content

Commit 10f1cf8

Browse files
fix: dropdown error
1 parent 4148dd4 commit 10f1cf8

6 files changed

Lines changed: 34 additions & 7 deletions

File tree

‎ui/src/components/COMPONENT_README.md‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ Drawer 没有 `MkDialog` 的外壳挂载控制;需要按需挂载时,由业
198198
### MkDropdown、MkDropdownMenu、MkDropdownItem
199199

200200
`MkDropdown` 默认 `persistent: false`,透传 Dropdown 属性、事件,公开 `handleOpen()`、`handleClose()`。
201+
开启 `persistent` 时仍延迟到首次展开才挂载菜单内容,之后收起保留 Action 及其业务浮层,直到所属
202+
组件卸载;未打开过的菜单不提前挂载。状态由组件内部维护,外部 `visible-change` 事件继续正常触发。
203+
已打开过的多个菜单会分别保留;Dialog、Drawer 仍应点击时挂载并在 `closed` 后卸载。
201204
`dropdown` 插槽内组合 `MkDropdownMenu`、`MkDropdownItem`,不在业务中重复组装底层组件。
202205
菜单项通过 `icon` Prop 传 Element Plus 图标,或使用 `icon` 插槽;`selectable` 预留勾选位,
203206
`selected` 控制选中。触发器遵循单根节点规则。
@@ -446,7 +449,9 @@ Dialog、Drawer、Popover、嵌套区域等其他大、小表格均禁止开启
446449
表格操作列需要 More 菜单时使用 `MkTableMoreDropdown`。组件统一提供点击型、右下定位的 More
447450
按钮以及 `MkDropdownMenu`,默认插槽中直接放置 `MkDropdownItem`;插槽为空,或其中的条件菜单项
448451
均未渲染时,不显示 More 触发器。其他 Dropdown 属性和事件通过 `$attrs` 传入,菜单容器样式通过
449-
`menu-class` 设置。
452+
`menu-class` 设置。默认启用 `persistent`,复用 `MkDropdown` 的首次展开后保留机制,避免收起菜单
453+
销毁 Action 中打开的 Dialog 或 Drawer;无需页面自行监听 `visible-change`。纯操作菜单可显式
454+
传入 `:persistent="false"`,收起后释放菜单内容。
450455

451456
包含 `type="selection"` 的选择列时,选择数据会显示页面底部操作栏。批量按钮放入
452457
`footer-batch-actions` 插槽,当前选择通过 `selection-change` 返回。组件暴露 `tableRef` 和
@@ -476,7 +481,8 @@ Dialog、Drawer、Popover、嵌套区域等其他大、小表格均禁止开启
476481
`footer` 提供常驻内容及 `Action`、`ActionDropdown`:前者是悬浮/焦点操作容器,后者包裹 More 菜单,
477482
内部直接放 `MkDropdownItem`,空菜单隐藏入口。仅需要开关或按钮时使用 `Action` 即可。
478483
无有效 `footer` 内容时不渲染底栏,默认内容区不额外保留底部间距;有底栏时保留 16px 分隔。
479-
`ActionDropdown` 固定 `persistent`,其管理的业务浮层应打开时挂载、`closed` 后卸载。
484+
`ActionDropdown` 固定 `persistent`,复用 `MkDropdown` 的首次展开后保留机制,不在卡片列表初始化时
485+
提前挂载菜单内容;其管理的业务浮层应打开时挂载、`closed` 后卸载。
480486

481487
`selectable` 开启卡片选择,`selected` Prop 控制选中,`selected` 事件返回新状态。
482488
点击卡片或复选框切换,`Action` 在选择模式下不渲染;页面负责选择集合、批量操作和特殊内容显隐。

‎ui/src/components/global/mk-dropdown/index.vue‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ withDefaults(defineProps<{ popperOptions?: Partial<Options>; persistent?: boolea
1515
})
1616
1717
const dropdownRef = ref<DropdownInstance>()
18+
// 保留模式也延迟到首次展开,避免列表初始化时挂载每一行的菜单及业务浮层。
19+
const hasOpened = ref(false)
20+
21+
function handleVisibleChange(visible: boolean) {
22+
if (visible) hasOpened.value = true
23+
}
1824
1925
const slots = defineSlots<{
2026
/** 下拉触发器,必须只渲染一个有效根节点 */
@@ -54,8 +60,9 @@ defineExpose({ handleOpen, handleClose })
5460
v-if="!hideWhenEmpty || hasDropdownContent(slots.dropdown?.())"
5561
class="mk-dropdown"
5662
ref="dropdownRef"
57-
:persistent="persistent"
63+
:persistent="persistent && hasOpened"
5864
v-bind="$attrs"
65+
@visible-change="handleVisibleChange"
5966
>
6067
<slot />
6168
<template #dropdown>

‎ui/src/components/global/mk-table/MkTableMoreDropdown.vue‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { hasRenderableSlotContent } from '@/utils/vnode'
44
55
defineOptions({ name: 'MkTableMoreDropdown', inheritAttrs: false })
66
7-
defineProps<{ menuClass?: string }>()
7+
withDefaults(defineProps<{ menuClass?: string; persistent?: boolean }>(), { persistent: true })
88
99
defineSlots<{
1010
/** 表格 More 菜单项,仅使用 MkDropdownItem */
@@ -16,7 +16,14 @@ const hasDropdownItems = computed(() => hasRenderableSlotContent(slots.default?.
1616
</script>
1717

1818
<template>
19-
<MkDropdown v-if="hasDropdownItems" class="mk-table-more-dropdown [button+&]:ml-1" trigger="click" placement="bottom-end" v-bind="$attrs">
19+
<MkDropdown
20+
v-if="hasDropdownItems"
21+
class="mk-table-more-dropdown [button+&]:ml-1"
22+
trigger="click"
23+
placement="bottom-end"
24+
:persistent="persistent"
25+
v-bind="$attrs"
26+
>
2027
<el-button type="primary" text @click.stop>
2128
<MkIcon name="icon_more_outlined" />
2229
</el-button>

‎ui/src/views/VIEW_README.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
`<!-- 修改用户密码 -->`、`<!-- 更多 -->`、`<!-- 删除 -->`、`<!-- 批量设置角色 -->`。
4747
备注紧邻对应按钮、菜单项或封装后的入口组件;批量操作明确标注“批量”,名称按实际业务职责
4848
填写。今后新增或调整同类页面时统一补齐,不因操作已封装为组件或按钮已有文案而省略。
49+
- 下拉菜单中包含自带 Dialog 或 Drawer 的 Action 时,使用公共组件的延迟保留机制:
50+
`MkTableMoreDropdown` 和资源卡片菜单默认启用,直接使用 `MkDropdown` 时传入 `persistent`。
51+
公共组件在首次展开后保留菜单,页面不自行维护菜单挂载状态或通过 `visible-change` 控制保留。
52+
仅调用页面方法、且浮层挂载在菜单外的操作不需要保留菜单。
4953
- Dialog 生命周期遵循 `COMPONENT_README.md` 的挂载方式规则:常驻实例在 `closed` 清理,
5054
关闭后卸载的实例依赖重新初始化,`open()` 不重复清空,只处理业务回填和查询。
5155
- 页面模板的事件绑定不直接调用 Dialog、Drawer 等组件实例暴露的 `open()` 方法。应在对应业务
@@ -701,6 +705,8 @@ Workspace API 内部通过 `getWorkspaceId()` 读取当前路由工作空间。
701705
`KNOWLEDGE_TYPE_KEY` 判断,不从详情或文档数据读取类型,也不通过 `knowledgeType` Prop 传递。
702706
Web 来源地址与选择器仅在单项设置中编辑,批量设置不展示这两个字段。
703707
文档操作统一放在 `document/action-dropdown/`,通过该目录 `index.ts` 导出,页面显式组合各 Action。
708+
文档页行操作使用 `MkTableMoreDropdown` 默认的延迟保留机制,批量操作菜单显式设置 `persistent`;
709+
首次展开才挂载菜单内容,收起后保留 Action 及其弹窗,生命周期统一由公共组件管理。
704710
文档状态展示、筛选配置和任务运行状态判断统一维护在 `document/status.ts`。
705711
文档任务是否排队或执行中通过其中的 `isDocumentTaskRunning(document, taskType)` 判断,
706712
页面及 Action 不重复解析状态字符串;文档或任务状态缺失时返回 `false`。

‎ui/src/views/knowledge-detail/document/index.vue‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ onBeforeUnmount(() => {
271271
<MkQuickCreate ref="quickCreateRef" text="快速创建空白文档" placeholder="请输入文档名称" @create="handleCreateDocument" />
272272
</template>
273273

274-
<el-table-column v-if="!isWorkspaceSharedResource()" type="selection" width="40" fixed="left" reserve-selection />
274+
<el-table-column v-if="!isWorkspaceSharedResource()" type="selection" width="40" reserve-selection />
275275

276276
<el-table-column prop="name" label="文档名称" min-width="220" show-overflow-tooltip />
277277

@@ -502,7 +502,7 @@ onBeforeUnmount(() => {
502502
<el-button>添加标签</el-button>
503503

504504
<!-- 更多批量操作 -->
505-
<MkDropdown class="ml-3" trigger="click" placement="bottom-end" hide-when-empty>
505+
<MkDropdown class="ml-3" trigger="click" placement="bottom-end" hide-when-empty persistent>
506506
<!-- 展开更多批量操作 -->
507507
<el-button plain type="primary" class="min-w-0! w-8!">
508508
<MkIcon name="icon_more_outlined" />

‎ui/src/views/system/resource-management/application/index.vue‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ onMounted(() => {
101101
:max-table-height="210"
102102
@current-change="loadApplicationPage"
103103
@size-change="loadApplicationPage"
104+
resizable
104105
>
105106
<el-table-column prop="name" label="名称" min-width="200" show-overflow-tooltip>
106107
<template #default="{ row }">

0 commit comments

Comments
 (0)