@@ -4,6 +4,19 @@ import classNames from 'classnames';
44import ResizeObserver from 'rc-resize-observer' ;
55import Item from './Item' ;
66import { 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 ) ;
720
821const RESPONSIVE = 'responsive' as const ;
922
@@ -22,7 +35,8 @@ export interface OverflowProps<ItemType> extends React.HTMLAttributes<any> {
2235 /** Used for `responsive`. It will limit render node to avoid perf issue */
2336 itemWidth ?: number ;
2437 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 ;
2640 maxCount ?: number | typeof RESPONSIVE ;
2741 renderRest ?:
2842 | React . ReactNode
@@ -44,16 +58,16 @@ function Overflow<ItemType = any>(
4458 prefixCls = 'rc-overflow' ,
4559 data = [ ] ,
4660 renderItem,
61+ renderRawItem,
4762 itemKey,
4863 itemWidth = 10 ,
4964 style,
5065 className,
5166 maxCount,
5267 renderRest = defaultRenderRest ,
53- renderItemProps,
5468 suffix,
5569 component : Component = 'div' ,
56- itemComponent = 'div' ,
70+ itemComponent,
5771 ...restProps
5872 } = props ;
5973
@@ -234,14 +248,28 @@ function Overflow<ItemType = any>(
234248 component : itemComponent ,
235249 } ;
236250
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 ) => {
245273 const key = getKey ( item , index ) ;
246274
247275 return (
@@ -254,10 +282,18 @@ function Overflow<ItemType = any>(
254282 itemKey = { key }
255283 registerSize = { registerSize }
256284 display = { index <= displayCount }
257- { ...renderItemProps ?.( item ) }
258285 />
259286 ) ;
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 ) }
261297
262298 { /* Rest Count Item */ }
263299 { showRest ? (
@@ -304,11 +340,18 @@ function Overflow<ItemType = any>(
304340
305341const ForwardOverflow = React . forwardRef ( Overflow ) ;
306342
307- ForwardOverflow . displayName = 'Overflow' ;
308-
309- // Convert to generic type
310- export default ForwardOverflow as < ItemType = any > (
343+ type ForwardOverflowType = < ItemType = any > (
311344 props : React . PropsWithChildren < OverflowProps < ItemType > > & {
312345 ref ?: React . Ref < HTMLDivElement > ;
313346 } ,
314347) => 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