perf: menu

feat-css-var
tangjinzhou 2022-03-02 12:48:07 +08:00
parent 32fc4fc7c4
commit 4904fa779f
2 changed files with 49 additions and 45 deletions

View File

@ -413,9 +413,8 @@ export default defineComponent({
<MenuContextProvider <MenuContextProvider
key={child.key} key={child.key}
overflowDisabled={index > lastVisibleIndex.value} overflowDisabled={index > lastVisibleIndex.value}
> v-slots={{ default: () => child }}
{child} ></MenuContextProvider>
</MenuContextProvider>
)); ));
const overflowedIndicator = slots.overflowedIndicator?.() || <EllipsisOutlined />; const overflowedIndicator = slots.overflowedIndicator?.() || <EllipsisOutlined />;
@ -446,9 +445,8 @@ export default defineComponent({
title={overflowedIndicator} title={overflowedIndicator}
disabled={allVisible} disabled={allVisible}
internalPopupClose={len === 0} internalPopupClose={len === 0}
> v-slots={{ default: () => originOmitItems }}
{originOmitItems} ></SubMenu>
</SubMenu>
<PathContext> <PathContext>
<SubMenu <SubMenu
eventKey={OVERFLOW_KEY} eventKey={OVERFLOW_KEY}
@ -456,9 +454,8 @@ export default defineComponent({
title={overflowedIndicator} title={overflowedIndicator}
disabled={allVisible} disabled={allVisible}
internalPopupClose={len === 0} internalPopupClose={len === 0}
> v-slots={{ default: () => originOmitItems }}
{originOmitItems} ></SubMenu>
</SubMenu>
</PathContext> </PathContext>
</> </>
); );

View File

@ -230,6 +230,37 @@ export default defineComponent({
const subMenuTriggerModeRef = computed(() => const subMenuTriggerModeRef = computed(() =>
triggerModeRef.value === 'horizontal' ? 'vertical' : triggerModeRef.value, triggerModeRef.value === 'horizontal' ? 'vertical' : triggerModeRef.value,
); );
const baseTitleNode = () => {
const subMenuPrefixClsValue = subMenuPrefixCls.value;
const icon = getPropsSlot(slots, props, 'icon');
const expandIcon = props.expandIcon || slots.expandIcon || menuExpandIcon.value;
const title = renderTitle(getPropsSlot(slots, props, 'title'), icon);
return (
<div
style={directionStyle.value}
class={`${subMenuPrefixClsValue}-title`}
tabindex={mergedDisabled.value ? null : -1}
ref={elementRef}
title={typeof title === 'string' ? title : null}
data-menu-id={key}
aria-expanded={open.value}
aria-haspopup
aria-controls={popupId}
aria-disabled={mergedDisabled.value}
onClick={onInternalTitleClick}
onFocus={onInternalFocus}
>
{title}
{/* Only non-horizontal mode shows the icon */}
{mode.value !== 'horizontal' && expandIcon ? (
expandIcon({ ...props, isOpen: open.value })
) : (
<i class={`${subMenuPrefixClsValue}-arrow`} />
)}
</div>
);
};
return () => { return () => {
if (isMeasure) { if (isMeasure) {
if (!hasKey) { if (!hasKey) {
@ -238,36 +269,7 @@ export default defineComponent({
return slots.default?.(); return slots.default?.();
} }
const subMenuPrefixClsValue = subMenuPrefixCls.value; const subMenuPrefixClsValue = subMenuPrefixCls.value;
const baseTitleNode = () => {
const icon = getPropsSlot(slots, props, 'icon');
const expandIcon = props.expandIcon || slots.expandIcon || menuExpandIcon.value;
const title = renderTitle(getPropsSlot(slots, props, 'title'), icon);
return (
<div
style={directionStyle.value}
class={`${subMenuPrefixClsValue}-title`}
tabindex={mergedDisabled.value ? null : -1}
ref={elementRef}
title={typeof title === 'string' ? title : null}
data-menu-id={key}
aria-expanded={open.value}
aria-haspopup
aria-controls={popupId}
aria-disabled={mergedDisabled.value}
onClick={onInternalTitleClick}
onFocus={onInternalFocus}
>
{title}
{/* Only non-horizontal mode shows the icon */}
{mode.value !== 'horizontal' && expandIcon ? (
expandIcon({ ...props, isOpen: open.value })
) : (
<i class={`${subMenuPrefixClsValue}-arrow`} />
)}
</div>
);
};
let titleNode = () => null; let titleNode = () => null;
if (!overflowDisabled.value && mode.value !== 'inline') { if (!overflowDisabled.value && mode.value !== 'inline') {
titleNode = () => ( titleNode = () => (
@ -282,9 +284,11 @@ export default defineComponent({
v-slots={{ v-slots={{
popup: () => ( popup: () => (
<MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}> <MenuContextProvider mode={subMenuTriggerModeRef.value} isRootMenu={false}>
<SubMenuList id={popupId} ref={popupRef}> <SubMenuList
{slots.default?.()} id={popupId}
</SubMenuList> ref={popupRef}
v-slots={{ default: slots.default }}
></SubMenuList>
</MenuContextProvider> </MenuContextProvider>
), ),
}} }}
@ -295,7 +299,7 @@ export default defineComponent({
} else { } else {
// //
// https://github.com/vueComponent/ant-design-vue/issues/4325 // https://github.com/vueComponent/ant-design-vue/issues/4325
titleNode = () => <PopupTrigger>{baseTitleNode()}</PopupTrigger>; titleNode = () => <PopupTrigger v-slots={{ default: baseTitleNode }}></PopupTrigger>;
} }
return ( return (
<MenuContextProvider mode={renderMode.value}> <MenuContextProvider mode={renderMode.value}>
@ -324,9 +328,12 @@ export default defineComponent({
{/* Inline mode */} {/* Inline mode */}
{!overflowDisabled.value && ( {!overflowDisabled.value && (
<InlineSubMenuList id={popupId} open={open.value} keyPath={keysPath.value}> <InlineSubMenuList
{slots.default?.()} id={popupId}
</InlineSubMenuList> open={open.value}
keyPath={keysPath.value}
v-slots={{ default: slots.default }}
></InlineSubMenuList>
)} )}
</> </>
); );