Skip to content

Commit 1ae0d51

Browse files
committed
fix: menu arrow not work
1 parent a6f37de commit 1ae0d51

File tree

6 files changed

+99
-88
lines changed

6 files changed

+99
-88
lines changed

components/menu/src/Menu.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -346,17 +346,21 @@ export default defineComponent({
346346
};
347347

348348
const lastVisibleIndex = ref(0);
349-
const expandIcon: MenuProps['expandIcon'] = opt => {
350-
let icon = props.expandIcon || slots.expandIcon;
351-
icon = typeof icon === 'function' ? icon(opt) : icon;
352-
return cloneElement(
353-
icon,
354-
{
355-
class: `${prefixCls.value}-submenu-expand-icon`,
356-
},
357-
false,
358-
);
359-
};
349+
const expandIcon = computed<MenuProps['expandIcon']>(() =>
350+
props.expandIcon || slots.expandIcon
351+
? opt => {
352+
let icon = props.expandIcon || slots.expandIcon;
353+
icon = typeof icon === 'function' ? icon(opt) : icon;
354+
return cloneElement(
355+
icon,
356+
{
357+
class: `${prefixCls.value}-submenu-expand-icon`,
358+
},
359+
false,
360+
);
361+
}
362+
: null,
363+
);
360364
useProvideMenu({
361365
store,
362366
prefixCls,

components/menu/src/SubMenu.tsx

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -230,41 +230,42 @@ export default defineComponent({
230230
);
231231

232232
return () => {
233-
const icon = getPropsSlot(slots, props, 'icon');
234-
const title = renderTitle(getPropsSlot(slots, props, 'title'), icon);
235233
const subMenuPrefixClsValue = subMenuPrefixCls.value;
236-
const expandIcon = props.expandIcon || slots.expandIcon || menuExpandIcon;
237-
let titleNode = (
238-
<div
239-
style={directionStyle.value}
240-
class={`${subMenuPrefixClsValue}-title`}
241-
tabindex={mergedDisabled.value ? null : -1}
242-
ref={elementRef}
243-
title={typeof title === 'string' ? title : null}
244-
data-menu-id={key}
245-
aria-expanded={open.value}
246-
aria-haspopup
247-
aria-controls={popupId}
248-
aria-disabled={mergedDisabled.value}
249-
onClick={onInternalTitleClick}
250-
onFocus={onInternalFocus}
251-
>
252-
{title}
253-
254-
{/* Only non-horizontal mode shows the icon */}
255-
{mode.value !== 'horizontal' && expandIcon ? (
256-
expandIcon({ ...props, isOpen: open.value })
257-
) : (
258-
<i class={`${subMenuPrefixClsValue}-arrow`} />
259-
)}
260-
</div>
261-
);
234+
let baseTitleNode = () => {
235+
const icon = getPropsSlot(slots, props, 'icon');
236+
const expandIcon = props.expandIcon || slots.expandIcon || menuExpandIcon.value;
237+
const title = renderTitle(getPropsSlot(slots, props, 'title'), icon);
238+
return (
239+
<div
240+
style={directionStyle.value}
241+
class={`${subMenuPrefixClsValue}-title`}
242+
tabindex={mergedDisabled.value ? null : -1}
243+
ref={elementRef}
244+
title={typeof title === 'string' ? title : null}
245+
data-menu-id={key}
246+
aria-expanded={open.value}
247+
aria-haspopup
248+
aria-controls={popupId}
249+
aria-disabled={mergedDisabled.value}
250+
onClick={onInternalTitleClick}
251+
onFocus={onInternalFocus}
252+
>
253+
{title}
262254

255+
{/* Only non-horizontal mode shows the icon */}
256+
{mode.value !== 'horizontal' && expandIcon ? (
257+
expandIcon({ ...props, isOpen: open.value })
258+
) : (
259+
<i class={`${subMenuPrefixClsValue}-arrow`} />
260+
)}
261+
</div>
262+
);
263+
};
264+
let titleNode = () => null;
263265
if (!overflowDisabled.value && mode.value !== 'inline') {
264-
const triggerMode = triggerModeRef.value;
265-
titleNode = (
266+
titleNode = () => (
266267
<PopupTrigger
267-
mode={triggerMode}
268+
mode={triggerModeRef.value}
268269
prefixCls={subMenuPrefixClsValue}
269270
visible={!props.internalPopupClose && open.value}
270271
popupClassName={popupClassName.value}
@@ -283,13 +284,13 @@ export default defineComponent({
283284
),
284285
}}
285286
>
286-
{titleNode}
287+
{baseTitleNode()}
287288
</PopupTrigger>
288289
);
289290
} else {
290291
// 包裹一层,保持结构一致,防止动画丢失
291292
// https://github.com/vueComponent/ant-design-vue/issues/4325
292-
titleNode = <PopupTrigger>{titleNode}</PopupTrigger>;
293+
titleNode = () => <PopupTrigger>{baseTitleNode()}</PopupTrigger>;
293294
}
294295
return (
295296
<MenuContextProvider mode={renderMode.value}>
@@ -311,16 +312,21 @@ export default defineComponent({
311312
onMouseenter={onMouseEnter}
312313
onMouseleave={onMouseLeave}
313314
data-submenu-id={key}
314-
>
315-
{titleNode}
315+
v-slots={() => {
316+
return (
317+
<>
318+
{titleNode()}
316319

317-
{/* Inline mode */}
318-
{!overflowDisabled.value && (
319-
<InlineSubMenuList id={popupId} open={open.value} keyPath={keysPath.value}>
320-
{slots.default?.()}
321-
</InlineSubMenuList>
322-
)}
323-
</Overflow.Item>
320+
{/* Inline mode */}
321+
{!overflowDisabled.value && (
322+
<InlineSubMenuList id={popupId} open={open.value} keyPath={keysPath.value}>
323+
{slots.default?.()}
324+
</InlineSubMenuList>
325+
)}
326+
</>
327+
);
328+
}}
329+
></Overflow.Item>
324330
</MenuContextProvider>
325331
);
326332
};

components/menu/src/hooks/useMenuContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export interface MenuContextProps {
7575

7676
// // Icon
7777
// itemIcon?: RenderIconType;
78-
expandIcon?: (p?: { isOpen: boolean; [key: string]: any }) => any;
78+
expandIcon?: ComputedRef<(p?: { isOpen: boolean; [key: string]: any }) => any>;
7979

8080
// // Function
8181
onItemClick: MenuClickEventHandler;

components/vc-overflow/Item.tsx

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,27 @@ export default defineComponent({
7171
overflowProps['aria-hidden'] = true;
7272
}
7373

74-
const itemNode = (
75-
<Component
76-
class={classNames(!invalidate && prefixCls)}
77-
style={overflowStyle}
78-
{...overflowProps}
79-
{...restProps}
80-
ref={itemNodeRef}
81-
>
82-
{childNode}
83-
</Component>
84-
);
85-
8674
// 使用 disabled 避免结构不一致 导致子组件 rerender
8775
return (
8876
<ResizeObserver
8977
disabled={!responsive}
9078
onResize={({ offsetWidth }) => {
9179
internalRegisterSize(offsetWidth);
9280
}}
93-
>
94-
{itemNode}
95-
</ResizeObserver>
81+
v-slots={{
82+
default: () => (
83+
<Component
84+
class={classNames(!invalidate && prefixCls)}
85+
style={overflowStyle}
86+
{...overflowProps}
87+
{...restProps}
88+
ref={itemNodeRef}
89+
>
90+
{childNode}
91+
</Component>
92+
),
93+
}}
94+
></ResizeObserver>
9695
);
9796
};
9897
},

components/vc-overflow/Overflow.tsx

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ const Overflow = defineComponent({
302302
};
303303

304304
// >>>>> Rest node
305-
let restNode: VueNode;
305+
let restNode = () => null;
306306
const restContextProps = {
307307
order: displayRest ? mergedDisplayCount.value : Number.MAX_SAFE_INTEGER,
308308
className: `${itemPrefixCls.value}-rest`,
@@ -313,19 +313,21 @@ const Overflow = defineComponent({
313313
if (!renderRawRest) {
314314
const mergedRenderRest = renderRest || defaultRenderRest;
315315

316-
restNode = (
316+
restNode = () => (
317317
<Item
318318
{...itemSharedProps}
319319
// When not show, order should be the last
320320
{...restContextProps}
321-
>
322-
{typeof mergedRenderRest === 'function'
323-
? mergedRenderRest(omittedItems.value)
324-
: mergedRenderRest}
325-
</Item>
321+
v-slots={{
322+
default: () =>
323+
typeof mergedRenderRest === 'function'
324+
? mergedRenderRest(omittedItems.value)
325+
: mergedRenderRest,
326+
}}
327+
></Item>
326328
);
327329
} else if (renderRawRest) {
328-
restNode = (
330+
restNode = () => (
329331
<OverflowContextProvider
330332
value={{
331333
...itemSharedProps,
@@ -337,7 +339,7 @@ const Overflow = defineComponent({
337339
);
338340
}
339341

340-
const overflowNode = (
342+
const overflowNode = () => (
341343
<Component
342344
class={classNames(!invalidate.value && prefixCls, className)}
343345
style={style}
@@ -346,7 +348,7 @@ const Overflow = defineComponent({
346348
{mergedData.value.map(internalRenderItemNode)}
347349

348350
{/* Rest Count Item */}
349-
{showRest.value ? restNode : null}
351+
{showRest.value ? restNode() : null}
350352

351353
{/* Suffix Node */}
352354
{suffix && (
@@ -357,17 +359,18 @@ const Overflow = defineComponent({
357359
registerSize={registerSuffixSize}
358360
display
359361
style={suffixStyle}
360-
>
361-
{suffix}
362-
</Item>
362+
v-slots={{ default: () => suffix }}
363+
></Item>
363364
)}
364365
</Component>
365366
);
366367
// 使用 disabled 避免结构不一致 导致子组件 rerender
367368
return (
368-
<ResizeObserver disabled={!isResponsive.value} onResize={onOverflowResize}>
369-
{overflowNode}
370-
</ResizeObserver>
369+
<ResizeObserver
370+
disabled={!isResponsive.value}
371+
onResize={onOverflowResize}
372+
v-slots={{ default: overflowNode }}
373+
></ResizeObserver>
371374
);
372375
};
373376
},

components/vc-overflow/RawItem.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ export default defineComponent({
3535
{...restContext}
3636
{...restProps}
3737
{...props}
38-
>
39-
{slots.default?.()}
40-
</Item>
38+
v-slots={slots}
39+
></Item>
4140
</OverflowContextProvider>
4241
);
4342
};

0 commit comments

Comments
 (0)