Skip to content

Commit e0934f9

Browse files
RSS1102tdesign-botuyarn
authored
feat(menu): menu item supports flip(#6392)
* fix(menu): 修复菜单子项定位样式切换逻辑 * refactor: 移除 submenu 中的类型断言 * chore: stash changelog [ci skip] * chore: update CHANGELOG --------- Co-authored-by: tdesign-bot <tdesign@tencent.com> Co-authored-by: wū yāng <uyarnchen@gmail.com>
1 parent fec3631 commit e0934f9

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

packages/components/menu/submenu.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@ export default defineComponent({
7777
}
7878
};
7979

80+
const handlePlacementChange = ({ placement }: { placement: string }) => {
81+
const spacerEl = popupWrapperRef.value;
82+
if (!spacerEl) return;
83+
84+
const prefixClassName = `${classPrefix.value}-menu__spacer`;
85+
const isBottom = placement.startsWith('bottom');
86+
const isTop = placement.startsWith('top');
87+
88+
spacerEl.classList.toggle(`${prefixClassName}--bottom`, isBottom);
89+
spacerEl.classList.toggle(`${prefixClassName}--top`, isTop);
90+
};
91+
8092
const classes = computed(() => [
8193
`${classPrefix.value}-submenu`,
8294
{
@@ -265,7 +277,9 @@ export default defineComponent({
265277
ref={popupWrapperRef}
266278
class={[
267279
`${classPrefix.value}-menu__spacer`,
268-
`${classPrefix.value}-menu__spacer--${!isNested.value && isHead ? 'top' : 'left'}`,
280+
{
281+
[`${classPrefix.value}-menu__spacer--left`]: isNested.value || !isHead,
282+
},
269283
]}
270284
onMouseenter={handleEnterPopup}
271285
onMouseleave={handleMouseLeavePopup}
@@ -278,13 +292,31 @@ export default defineComponent({
278292
content: () => popupWrapper,
279293
};
280294

295+
// 合并 popperOptions,保留原有的 modifiers
296+
const existingModifiers = (props.popupProps?.popperOptions as any)?.modifiers || [];
297+
const popperOptions = {
298+
...(props.popupProps?.popperOptions ?? {}),
299+
modifiers: [
300+
{
301+
name: 'onPlacementChange',
302+
enabled: true,
303+
phase: 'main',
304+
fn: ({ state }: any) => {
305+
handlePlacementChange({ placement: state.placement });
306+
},
307+
},
308+
...existingModifiers,
309+
],
310+
};
311+
281312
const realPopup = (
282313
<Popup
283314
{...(props.popupProps ?? {})}
284315
overlayInnerClassName={[...overlayInnerClassName.value]}
285316
overlayClassName={[...overlayClassName.value]}
286317
visible={popupVisible.value}
287318
placement={placement}
319+
popperOptions={popperOptions}
288320
v-slots={slots}
289321
>
290322
<div ref={submenuRef} class={submenuClass.value}>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
pr_number: 6392
3+
contributor: RSS1102
4+
---
5+
6+
- feat(menu): 支持菜单面板在空间不足时的自动反转 @RSS1102 ([#6392](https://github.com/Tencent/tdesign-vue-next/pull/6392))

0 commit comments

Comments
 (0)