@@ -4,6 +4,19 @@ import classNames from 'classnames';
4
4
import ResizeObserver from 'rc-resize-observer' ;
5
5
import Item from './Item' ;
6
6
import { useBatchFrameState } from './hooks/useBatchFrameState' ;
7
+ import RawItem from './RawItem' ;
8
+
9
+ export const OverflowContext = React . createContext < {
10
+ prefixCls : string ;
11
+ responsive : boolean ;
12
+ order : number ;
13
+ item : any ;
14
+ itemKey : React . Key ;
15
+ registerSize : ( key : React . Key , width : number | null ) => void ;
16
+ display : boolean ;
17
+
18
+ // renderItem={mergedRenderItem}
19
+ } > ( null ) ;
7
20
8
21
const RESPONSIVE = 'responsive' as const ;
9
22
@@ -22,7 +35,8 @@ export interface OverflowProps<ItemType> extends React.HTMLAttributes<any> {
22
35
/** Used for `responsive`. It will limit render node to avoid perf issue */
23
36
itemWidth ?: number ;
24
37
renderItem ?: ( item : ItemType ) => React . ReactNode ;
25
- renderItemProps ?: ( item : ItemType ) => React . HTMLAttributes < any > ;
38
+ /** @private Do not use in your production. Render raw node that need wrap Item by developer self */
39
+ renderRawItem ?: ( item : ItemType , index : number ) => React . ReactElement ;
26
40
maxCount ?: number | typeof RESPONSIVE ;
27
41
renderRest ?:
28
42
| React . ReactNode
@@ -44,16 +58,16 @@ function Overflow<ItemType = any>(
44
58
prefixCls = 'rc-overflow' ,
45
59
data = [ ] ,
46
60
renderItem,
61
+ renderRawItem,
47
62
itemKey,
48
63
itemWidth = 10 ,
49
64
style,
50
65
className,
51
66
maxCount,
52
67
renderRest = defaultRenderRest ,
53
- renderItemProps,
54
68
suffix,
55
69
component : Component = 'div' ,
56
- itemComponent = 'div' ,
70
+ itemComponent,
57
71
...restProps
58
72
} = props ;
59
73
@@ -234,14 +248,28 @@ function Overflow<ItemType = any>(
234
248
component : itemComponent ,
235
249
} ;
236
250
237
- let overflowNode = (
238
- < Component
239
- className = { classNames ( prefixCls , className ) }
240
- style = { style }
241
- ref = { ref }
242
- { ...restProps }
243
- >
244
- { mergedData . map ( ( item , index ) => {
251
+ // Choice render fun by `renderRawItem`
252
+ const internalRenderItemNode = renderRawItem
253
+ ? ( item : ItemType , index : number ) => {
254
+ const key = getKey ( item , index ) ;
255
+
256
+ return (
257
+ < OverflowContext . Provider
258
+ key = { key }
259
+ value = { {
260
+ ...itemSharedProps ,
261
+ order : index ,
262
+ item,
263
+ itemKey : key ,
264
+ registerSize,
265
+ display : index <= displayCount ,
266
+ } }
267
+ >
268
+ { renderRawItem ( item , index ) }
269
+ </ OverflowContext . Provider >
270
+ ) ;
271
+ }
272
+ : ( item : ItemType , index : number ) => {
245
273
const key = getKey ( item , index ) ;
246
274
247
275
return (
@@ -254,10 +282,18 @@ function Overflow<ItemType = any>(
254
282
itemKey = { key }
255
283
registerSize = { registerSize }
256
284
display = { index <= displayCount }
257
- { ...renderItemProps ?.( item ) }
258
285
/>
259
286
) ;
260
- } ) }
287
+ } ;
288
+
289
+ let overflowNode = (
290
+ < Component
291
+ className = { classNames ( prefixCls , className ) }
292
+ style = { style }
293
+ ref = { ref }
294
+ { ...restProps }
295
+ >
296
+ { mergedData . map ( internalRenderItemNode ) }
261
297
262
298
{ /* Rest Count Item */ }
263
299
{ showRest ? (
@@ -304,11 +340,18 @@ function Overflow<ItemType = any>(
304
340
305
341
const ForwardOverflow = React . forwardRef ( Overflow ) ;
306
342
307
- ForwardOverflow . displayName = 'Overflow' ;
308
-
309
- // Convert to generic type
310
- export default ForwardOverflow as < ItemType = any > (
343
+ type ForwardOverflowType = < ItemType = any > (
311
344
props : React . PropsWithChildren < OverflowProps < ItemType > > & {
312
345
ref ?: React . Ref < HTMLDivElement > ;
313
346
} ,
314
347
) => React . ReactElement ;
348
+
349
+ type FilledOverflowType = ForwardOverflowType & {
350
+ Item : typeof RawItem ;
351
+ } ;
352
+
353
+ ForwardOverflow . displayName = 'Overflow' ;
354
+ ( ( ForwardOverflow as unknown ) as FilledOverflowType ) . Item = RawItem ;
355
+
356
+ // Convert to generic type
357
+ export default ( ForwardOverflow as unknown ) as FilledOverflowType ;
0 commit comments