Skip to content

Commit aa1b246

Browse files
committed
fix: menu automatically close up to fit width in horizontal mode
1 parent 6ec6e38 commit aa1b246

File tree

5 files changed

+44
-32
lines changed

5 files changed

+44
-32
lines changed

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,19 @@ exports[`renders ./components/layout/demo/fixed.md correctly 1`] = `
7575
<div class="logo"></div>
7676
<ul role="menu" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-dark" style="line-height: 64px;">
7777
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
78-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
78+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
7979
</li>
8080
<li role="menuitem" class="ant-menu-item">nav 1</li>
8181
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
82-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
82+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
8383
</li>
8484
<li role="menuitem" class="ant-menu-item ant-menu-item-selected">nav 2</li>
8585
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
86-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
86+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
8787
</li>
8888
<li role="menuitem" class="ant-menu-item">nav 3</li>
8989
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility: hidden; position: absolute; display: none;">
90-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
90+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
9191
</li>
9292
</ul>
9393
</div>
@@ -245,19 +245,19 @@ exports[`renders ./components/layout/demo/top.md correctly 1`] = `
245245
<div class="logo"></div>
246246
<ul role="menu" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-dark" style="line-height: 64px;">
247247
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
248-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
248+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
249249
</li>
250250
<li role="menuitem" class="ant-menu-item">nav 1</li>
251251
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
252-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
252+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
253253
</li>
254254
<li role="menuitem" class="ant-menu-item ant-menu-item-selected">nav 2</li>
255255
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
256-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
256+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
257257
</li>
258258
<li role="menuitem" class="ant-menu-item">nav 3</li>
259259
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility: hidden; position: absolute; display: none;">
260-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
260+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
261261
</li>
262262
</ul>
263263
</div>
@@ -277,19 +277,19 @@ exports[`renders ./components/layout/demo/top-side.md correctly 1`] = `
277277
<div class="logo"></div>
278278
<ul role="menu" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-dark" style="line-height: 64px;">
279279
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
280-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
280+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
281281
</li>
282282
<li role="menuitem" class="ant-menu-item">nav 1</li>
283283
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
284-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
284+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
285285
</li>
286286
<li role="menuitem" class="ant-menu-item ant-menu-item-selected">nav 2</li>
287287
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
288-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
288+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
289289
</li>
290290
<li role="menuitem" class="ant-menu-item">nav 3</li>
291291
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility: hidden; position: absolute; display: none;">
292-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
292+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
293293
</li>
294294
</ul>
295295
</div>
@@ -336,19 +336,19 @@ exports[`renders ./components/layout/demo/top-side-2.md correctly 1`] = `
336336
<div class="logo"></div>
337337
<ul role="menu" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-dark" style="line-height: 64px;">
338338
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
339-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
339+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
340340
</li>
341341
<li role="menuitem" class="ant-menu-item">nav 1</li>
342342
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
343-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
343+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
344344
</li>
345345
<li role="menuitem" class="ant-menu-item ant-menu-item-selected">nav 2</li>
346346
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
347-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
347+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
348348
</li>
349349
<li role="menuitem" class="ant-menu-item">nav 3</li>
350350
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility: hidden; position: absolute; display: none;">
351-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
351+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
352352
</li>
353353
</ul>
354354
</div>

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@ exports[`renders ./components/menu/demo/horizontal.md correctly 1`] = `
44
<div>
55
<ul role="menu" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light">
66
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
7-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
7+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
88
</li>
99
<li role="menuitem" class="ant-menu-item ant-menu-item-selected"><i class="anticon anticon-mail"><svg viewBox="64 64 896 896" data-icon="mail" width="1em" height="1em" fill="currentColor" aria-hidden="true" class="">
1010
<path d="M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0 0 68.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z"></path>
1111
</svg></i>Navigation One
1212
</li>
1313
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
14-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
14+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
1515
</li>
1616
<li role="menuitem" aria-disabled="true" class="ant-menu-item ant-menu-item-disabled"><i class="anticon anticon-appstore"><svg viewBox="64 64 896 896" data-icon="appstore" width="1em" height="1em" fill="currentColor" aria-hidden="true" class="">
1717
<path d="M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"></path>
1818
</svg></i>Navigation Two
1919
</li>
2020
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
21-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
21+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
2222
</li>
2323
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal">
2424
<div aria-haspopup="true" class="ant-menu-submenu-title"><span class="submenu-title-wrapper"><i class="anticon anticon-setting"><svg viewBox="64 64 896 896" data-icon="setting" width="1em" height="1em" fill="currentColor" aria-hidden="true" class=""><path d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 0 0 9.3-35.2l-.9-2.6a443.74 443.74 0 0 0-79.7-137.9l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 0 0-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.4a351.86 351.86 0 0 0-99 57.4l-81.9-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a446.02 446.02 0 0 0-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0 0 35.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0 0 25.8 25.7l2.7.5a449.4 449.4 0 0 0 159 0l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-85a350 350 0 0 0 99.7-57.6l81.3 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 0 1-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 0 1-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 0 1 624 502c0 29.9-11.7 58-32.8 79.2z"></path></svg></i>Navigation Three - Submenu</span><i class="ant-menu-submenu-arrow"></i></div>
2525
</li>
2626
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display: none;">
27-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
27+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
2828
</li>
2929
<li role="menuitem" class="ant-menu-item"><a href="https://ant.design" target="_blank" rel="noopener noreferrer">Navigation Four - Link</a></li>
3030
<li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility: hidden; position: absolute; display: none;">
31-
<div aria-haspopup="true" class="ant-menu-submenu-title"><i class="ant-menu-submenu-arrow"></i></div>
31+
<div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div>
3232
</li>
3333
</ul>
3434
</div>

components/vc-menu/DOMWrap.jsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,24 +123,25 @@ const DOMWrap = {
123123
}
124124

125125
const popupClassName = theme ? `${prefixCls}-${theme}` : ''
126+
const props = {}
127+
menuAllProps.props.forEach(k => {
128+
if (rest[k] !== undefined) {
129+
props[k] = rest[k]
130+
}
131+
})
126132
const subMenuProps = {
127133
props: {
128-
title,
129-
overflowedIndicator,
134+
title: overflowedIndicator,
130135
popupClassName,
136+
...props,
131137
eventKey: `${keyPrefix}-overflowed-indicator`,
132138
disabled: false,
133139
},
134140
class: `${prefixCls}-overflowed-submenu`,
135141
key,
136142
style,
137-
on: copy.$listeners,
143+
on: copy.componentOptions.listeners,
138144
}
139-
menuAllProps.props.forEach(k => {
140-
if (rest[k] !== undefined) {
141-
subMenuProps.props[k] = rest[k]
142-
}
143-
})
144145

145146
return (
146147
<SubMenu
@@ -238,7 +239,7 @@ const DOMWrap = {
238239
if (this.mode === 'horizontal') {
239240
let overflowed = this.getOverflowedSubMenuItem(eventKey, [])
240241
if (lastVisibleIndex !== undefined &&
241-
className[`${this.prefixCls}-root`]
242+
className[`${this.prefixCls}-root`] !== -1
242243
) {
243244
if (index > lastVisibleIndex) {
244245
item = cloneElement(

components/vc-menu/Menu.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ const Menu = {
158158
...props,
159159
itemIcon: getComponentFromProp(this, 'itemIcon', props),
160160
expandIcon: getComponentFromProp(this, 'expandIcon', props),
161-
overflowedIndicator: getComponentFromProp(this, 'overflowedIndicator', props),
161+
overflowedIndicator: getComponentFromProp(this, 'overflowedIndicator', props) || <span>···</span>,
162162
openTransitionName: this.getOpenTransitionName(),
163163
parentMenu: this,
164164
children: filterEmpty(this.$slots.default || []),

components/vc-menu/SubPopupMenu.jsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ const SubPopupMenu = {
9999
manualRef: PropTypes.func,
100100
itemIcon: PropTypes.any,
101101
expandIcon: PropTypes.any,
102+
overflowedIndicator: PropTypes.any,
102103
children: PropTypes.any.def([]),
103104
__propsSymbol__: PropTypes.any, // mock componentWillReceiveProps
104105
}, {
@@ -113,7 +114,8 @@ const SubPopupMenu = {
113114

114115
mixins: [BaseMixin],
115116
created () {
116-
const props = this.$props
117+
const props = getOptionProps(this)
118+
this.prevProps = { ...props }
117119
props.store.setState({
118120
activeKey: {
119121
...props.store.getState().activeKey,
@@ -130,12 +132,21 @@ const SubPopupMenu = {
130132
},
131133
updated () {
132134
const props = getOptionProps(this)
135+
const prevProps = this.prevProps
133136
const originalActiveKey = 'activeKey' in props ? props.activeKey
134137
: props.store.getState().activeKey[getEventKey(props)]
135138
const activeKey = getActiveKey(props, originalActiveKey)
136139
if (activeKey !== originalActiveKey) {
137140
updateActiveKey(props.store, getEventKey(props), activeKey)
141+
} else if ('activeKey' in prevProps) {
142+
// If prev activeKey is not same as current activeKey,
143+
// we should set it.
144+
const prevActiveKey = getActiveKey(prevProps, prevProps.activeKey)
145+
if (activeKey !== prevActiveKey) {
146+
updateActiveKey(props.store, getEventKey(props), activeKey)
147+
}
138148
}
149+
this.prevProps = { ...props }
139150
},
140151
methods: {
141152
// all keyboard events callbacks run from here at first

0 commit comments

Comments
 (0)