Skip to content

Commit a406005

Browse files
authored
chore: keep node even no need responsive (#22)
1 parent ecf068e commit a406005

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

src/Item.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ export interface ItemProps<ItemType> extends React.HTMLAttributes<any> {
1313
style?: React.CSSProperties;
1414
renderItem?: (item: ItemType) => React.ReactNode;
1515
responsive?: boolean;
16+
// https://github.com/ant-design/ant-design/issues/35475
17+
/**
18+
* @private To make node structure stable. We need keep wrap with ResizeObserver.
19+
* But disable it when it's no need to real measure.
20+
*/
21+
responsiveDisabled?: boolean;
1622
itemKey?: React.Key;
1723
registerSize: (key: React.Key, width: number | null) => void;
1824
children?: React.ReactNode;
@@ -32,6 +38,7 @@ function InternalItem<ItemType>(
3238
item,
3339
renderItem,
3440
responsive,
41+
responsiveDisabled,
3542
registerSize,
3643
itemKey,
3744
className,
@@ -99,6 +106,7 @@ function InternalItem<ItemType>(
99106
onResize={({ offsetWidth }) => {
100107
internalRegisterSize(offsetWidth);
101108
}}
109+
disabled={responsiveDisabled}
102110
>
103111
{itemNode}
104112
</ResizeObserver>

src/Overflow.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,21 @@ function Overflow<ItemType = any>(
123123
const mergedRestWidth = Math.max(prevRestWidth, restWidth);
124124

125125
// ================================= Data =================================
126-
const isResponsive = data.length && maxCount === RESPONSIVE;
126+
const isResponsive = maxCount === RESPONSIVE;
127+
const shouldResponsive = data.length && isResponsive;
127128
const invalidate = maxCount === INVALIDATE;
128129

129130
/**
130131
* When is `responsive`, we will always render rest node to get the real width of it for calculation
131132
*/
132133
const showRest =
133-
isResponsive || (typeof maxCount === 'number' && data.length > maxCount);
134+
shouldResponsive ||
135+
(typeof maxCount === 'number' && data.length > maxCount);
134136

135137
const mergedData = useMemo(() => {
136138
let items = data;
137139

138-
if (isResponsive) {
140+
if (shouldResponsive) {
139141
if (containerWidth === null && fullySSR) {
140142
items = data;
141143
} else {
@@ -149,14 +151,14 @@ function Overflow<ItemType = any>(
149151
}
150152

151153
return items;
152-
}, [data, itemWidth, containerWidth, maxCount, isResponsive]);
154+
}, [data, itemWidth, containerWidth, maxCount, shouldResponsive]);
153155

154156
const omittedItems = useMemo(() => {
155-
if (isResponsive) {
157+
if (shouldResponsive) {
156158
return data.slice(mergedDisplayCount + 1);
157159
}
158160
return data.slice(mergedData.length);
159-
}, [data, mergedData, isResponsive, mergedDisplayCount]);
161+
}, [data, mergedData, shouldResponsive, mergedDisplayCount]);
160162

161163
// ================================= Item =================================
162164
const getKey = useCallback(
@@ -284,7 +286,7 @@ function Overflow<ItemType = any>(
284286
const displayRest = restReady && !!omittedItems.length;
285287

286288
let suffixStyle: React.CSSProperties = {};
287-
if (suffixFixedStart !== null && isResponsive) {
289+
if (suffixFixedStart !== null && shouldResponsive) {
288290
suffixStyle = {
289291
position: 'absolute',
290292
left: suffixFixedStart,
@@ -294,7 +296,7 @@ function Overflow<ItemType = any>(
294296

295297
const itemSharedProps = {
296298
prefixCls: itemPrefixCls,
297-
responsive: isResponsive,
299+
responsive: shouldResponsive,
298300
component: itemComponent,
299301
invalidate,
300302
};
@@ -389,6 +391,8 @@ function Overflow<ItemType = any>(
389391
{suffix && (
390392
<Item
391393
{...itemSharedProps}
394+
responsive={isResponsive}
395+
responsiveDisabled={!shouldResponsive}
392396
order={mergedDisplayCount}
393397
className={`${itemPrefixCls}-suffix`}
394398
registerSize={registerSuffixSize}
@@ -403,7 +407,7 @@ function Overflow<ItemType = any>(
403407

404408
if (isResponsive) {
405409
overflowNode = (
406-
<ResizeObserver onResize={onOverflowResize}>
410+
<ResizeObserver onResize={onOverflowResize} disabled={!shouldResponsive}>
407411
{overflowNode}
408412
</ResizeObserver>
409413
);

src/RawItem.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import * as React from 'react';
22
import classNames from 'classnames';
33
import Item from './Item';
4-
import { ComponentType, OverflowContext } from './Overflow';
4+
import { OverflowContext } from './Overflow';
5+
import type { ComponentType } from './Overflow';
56

67
export interface RawItemProps extends React.HTMLAttributes<any> {
78
component?: ComponentType;

0 commit comments

Comments
 (0)