Skip to content

Commit 48fed1f

Browse files
RSS1102uyarn
authored andcommitted
fix(menu): fix menu item auto-flip failure (#3744)
* fix(popup): force update popper after animation completes * fix(popup): 支持自定义 popper 内容元素类型 * fix(popup): 修复 popperContentElement 的类型处理逻辑 * fix(popup): 添加 popperContentElement 的类型定义 * fix(popup): 修复 popperContentElement 的类型处理,确保正确类型转换
1 parent 4779086 commit 48fed1f

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

src/menu/submenu.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ export default defineComponent({
270270
);
271271
const realPopup = (
272272
<Popup
273+
popperContentElement="overlay"
273274
{...((this.popupProps ?? {}) as TdSubmenuProps['popupProps'])}
274275
overlayInnerClassName={[...this.overlayInnerClassName]}
275276
overlayClassName={[...this.overlayClassName]}

src/popup/popup.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { VNodeDirective } from 'vue';
1+
import { PropType, VNodeDirective } from 'vue';
22
import { createPopper } from '@popperjs/core';
33
import { debounce } from 'lodash-es';
44
import { on, off, once } from '../utils/dom';
@@ -38,6 +38,13 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
3838

3939
props: {
4040
...props,
41+
/** @private
42+
* @description popper 内容元素,用于自定义 popper 元素时传入
43+
* 可以是 HTMLElement 或者 ref 名称字符串 (如 'overlay')
44+
*/
45+
popperContentElement: {
46+
type: [String, Object] as PropType<string | HTMLElement>,
47+
},
4148
expandAnimation: {
4249
type: Boolean,
4350
},
@@ -193,7 +200,13 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
193200
methods: {
194201
updatePopper() {
195202
const { $el: triggerEl } = this;
196-
const popperEl = this.$refs.popper as HTMLElement;
203+
// 支持传入字符串 ref 名称或 HTMLElement
204+
let popperEl: HTMLElement;
205+
if (typeof this.popperContentElement === 'string') {
206+
popperEl = this.$refs[this.popperContentElement] as HTMLElement;
207+
} else {
208+
popperEl = this.popperContentElement || (this.$refs.popper as HTMLElement);
209+
}
197210

198211
if (!popperEl || !this.visible) return;
199212
if (this.popper) {
@@ -363,8 +376,9 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
363376
}
364377
},
365378
onAfterEnter() {
366-
if (this.visible) {
367-
this.updatePopper();
379+
if (this.visible && this.popper) {
380+
// 动画完成后,元素已有正确尺寸,使用 forceUpdate 强制重新运行所有 modifiers
381+
this.popper.forceUpdate();
368382
}
369383
},
370384
onLeave() {

0 commit comments

Comments
 (0)