Skip to content

Commit 95a1b4a

Browse files
committed
perf: menu lazy render children #4812
1 parent 30f87e6 commit 95a1b4a

File tree

17 files changed

+432
-219
lines changed

17 files changed

+432
-219
lines changed

components/dropdown/demo/sub-menu.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ The menu has multiple levels.
2626
<a-menu>
2727
<a-menu-item>1st menu item</a-menu-item>
2828
<a-menu-item>2nd menu item</a-menu-item>
29-
<a-sub-menu key="test" title="sub menu">
29+
<a-sub-menu key="sub1" title="sub menu">
3030
<a-menu-item>3rd menu item</a-menu-item>
3131
<a-menu-item>4th menu item</a-menu-item>
3232
</a-sub-menu>
33-
<a-sub-menu title="disabled sub menu" disabled>
33+
<a-sub-menu key="sub2" title="disabled sub menu" disabled>
3434
<a-menu-item>5d menu item</a-menu-item>
3535
<a-menu-item>6th menu item</a-menu-item>
3636
</a-sub-menu>

components/layout/__tests__/__snapshots__/demo.test.js.snap

Lines changed: 113 additions & 42 deletions
Large diffs are not rendered by default.

components/menu/__tests__/__snapshots__/demo.test.js.snap

Lines changed: 156 additions & 88 deletions
Large diffs are not rendered by default.

components/menu/__tests__/index.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ describe('Menu', () => {
5555
{ attachTo: 'body', sync: false },
5656
);
5757
await asyncExpect(() => {
58-
expect($$('.ant-menu-submenu-selected').length).toBe(2);
58+
expect($$('li.ant-menu-submenu-selected').length).toBe(1);
5959
});
6060
});
6161
it('should accept openKeys in mode horizontal', async () => {

components/menu/demo/horizontal.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Horizontal top navigation menu.
3030
</template>
3131
Navigation Two
3232
</a-menu-item>
33-
<a-sub-menu>
33+
<a-sub-menu key="sub1">
3434
<template #icon>
3535
<setting-outlined />
3636
</template>

components/menu/demo/inline-collapsed.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export default defineComponent({
108108
109109
watch(
110110
() => state.openKeys,
111-
(val, oldVal) => {
111+
(_val, oldVal) => {
112112
state.preOpenKeys = oldVal;
113113
},
114114
);

components/menu/demo/template.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ Use the single file method to recursively generate menus.
2121
<MenuFoldOutlined v-else />
2222
</a-button>
2323
<a-menu
24-
:default-selected-keys="['1']"
25-
:default-open-keys="['2']"
24+
v-model:openKeys="openKeys"
25+
v-model:selectedKeys="selectedKeys"
2626
mode="inline"
2727
theme="dark"
2828
:inline-collapsed="collapsed"
@@ -119,6 +119,8 @@ export default defineComponent({
119119
list,
120120
collapsed,
121121
toggleCollapsed,
122+
selectedKeys: ref(['1']),
123+
openKeys: ref(['2']),
122124
};
123125
},
124126
});

components/menu/index.en-US.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ More layouts with navigation: [Layout](/components/layout).
2020
<template>
2121
<a-menu>
2222
<a-menu-item>Menu</a-menu-item>
23-
<a-sub-menu title="SubMenu">
23+
<a-sub-menu key="sub1" title="SubMenu">
2424
<a-menu-item>SubMenuItem</a-menu-item>
2525
</a-sub-menu>
2626
</a-menu>

components/menu/index.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3XZcjGpvK/Menu.svg
2121
<template>
2222
<a-menu>
2323
<a-menu-item>菜单项</a-menu-item>
24-
<a-sub-menu title="子菜单">
24+
<a-sub-menu key="sub1" title="子菜单">
2525
<a-menu-item>子菜单项</a-menu-item>
2626
</a-sub-menu>
2727
</a-menu>

components/menu/src/ItemGroup.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { ExtractPropTypes } from 'vue';
33
import { computed, defineComponent } from 'vue';
44
import PropTypes from '../../_util/vue-types';
55
import { useInjectMenu } from './hooks/useMenuContext';
6+
import { useMeasure } from './hooks/useKeyPath';
67

78
const menuItemGroupProps = {
89
title: PropTypes.VNodeChild,
@@ -18,7 +19,9 @@ export default defineComponent({
1819
setup(props, { slots, attrs }) {
1920
const { prefixCls } = useInjectMenu();
2021
const groupPrefixCls = computed(() => `${prefixCls.value}-item-group`);
22+
const isMeasure = useMeasure();
2123
return () => {
24+
if (isMeasure) return slots.default?.();
2225
return (
2326
<li {...attrs} onClick={e => e.stopPropagation()} class={groupPrefixCls.value}>
2427
<div

0 commit comments

Comments
 (0)