-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathItem.tsx
More file actions
122 lines (108 loc) · 2.93 KB
/
Item.tsx
File metadata and controls
122 lines (108 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import * as React from 'react';
import classNames from 'classnames';
import ResizeObserver from '@rc-component/resize-observer';
import type { ComponentType } from './RawItem';
// Use shared variable to save bundle size
const UNDEFINED = undefined;
export interface ItemProps<ItemType> extends React.HTMLAttributes<any> {
prefixCls: string;
item?: ItemType;
className?: string;
style?: React.CSSProperties;
renderItem?: (item: ItemType, info: { index: number }) => React.ReactNode;
responsive?: boolean;
// https://github.com/ant-design/ant-design/issues/35475
/**
* @private To make node structure stable. We need keep wrap with ResizeObserver.
* But disable it when it's no need to real measure.
*/
responsiveDisabled?: boolean;
itemKey?: React.Key;
registerSize: (key: React.Key, width: number | null) => void;
children?: React.ReactNode;
display: boolean;
order: number;
component?: ComponentType;
invalidate?: boolean;
}
function InternalItem<ItemType>(
props: ItemProps<ItemType>,
ref: React.Ref<any>,
) {
const {
prefixCls,
invalidate,
item,
renderItem,
responsive,
responsiveDisabled,
registerSize,
itemKey,
className,
style,
children,
display,
order,
component: Component = 'div',
...restProps
} = props;
const mergedHidden = responsive && !display;
// ================================ Effect ================================
function internalRegisterSize(width: number | null) {
registerSize(itemKey!, width);
}
React.useEffect(
() => () => {
internalRegisterSize(null);
},
[],
);
// ================================ Render ================================
const childNode =
renderItem && item !== UNDEFINED ? renderItem(item, { index: order }) : children;
let overflowStyle: React.CSSProperties | undefined;
if (!invalidate) {
overflowStyle = {
opacity: mergedHidden ? 0 : 1,
height: mergedHidden ? 0 : UNDEFINED,
overflowY: mergedHidden ? 'hidden' : UNDEFINED,
order: responsive ? order : UNDEFINED,
pointerEvents: mergedHidden ? 'none' : UNDEFINED,
position: mergedHidden ? 'absolute' : UNDEFINED,
};
}
const overflowProps: React.HTMLAttributes<any> = {};
if (mergedHidden) {
overflowProps['aria-hidden'] = true;
}
let itemNode = (
<Component
className={classNames(!invalidate && prefixCls, className)}
style={{
...overflowStyle,
...style,
}}
{...overflowProps}
{...restProps}
ref={ref}
>
{childNode}
</Component>
);
if (responsive) {
itemNode = (
<ResizeObserver
onResize={({ offsetWidth }) => {
internalRegisterSize(offsetWidth);
}}
disabled={responsiveDisabled}
>
{itemNode}
</ResizeObserver>
);
}
return itemNode;
}
const Item = React.forwardRef(InternalItem);
Item.displayName = 'Item';
export default Item;