@@ -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 } >
0 commit comments