Skip to content

Commit 232f89f

Browse files
authored
feat: Support customize component (#7)
1 parent c2ece6e commit 232f89f

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

src/Item.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as React from 'react';
22
import classNames from 'classnames';
33
import ResizeObserver from 'rc-resize-observer';
4+
import { ComponentType } from './Overflow';
45

56
export interface ItemProps<ItemType> {
67
prefixCls: string;
@@ -14,6 +15,7 @@ export interface ItemProps<ItemType> {
1415
children?: React.ReactNode;
1516
display: boolean;
1617
order: number;
18+
component?: ComponentType;
1719
}
1820

1921
export default function Item<ItemType>(props: ItemProps<ItemType>) {
@@ -29,6 +31,7 @@ export default function Item<ItemType>(props: ItemProps<ItemType>) {
2931
children,
3032
display,
3133
order,
34+
component: Component,
3235
} = props;
3336

3437
const mergedHidden = responsive && !display;
@@ -49,7 +52,7 @@ export default function Item<ItemType>(props: ItemProps<ItemType>) {
4952
const childNode = item !== undefined ? renderItem!(item) : children;
5053

5154
let itemNode = (
52-
<div
55+
<Component
5356
className={classNames(prefixCls, className)}
5457
style={{
5558
opacity: mergedHidden ? 0.2 : 1,
@@ -61,7 +64,7 @@ export default function Item<ItemType>(props: ItemProps<ItemType>) {
6164
}}
6265
>
6366
{childNode}
64-
</div>
67+
</Component>
6568
);
6669

6770
if (responsive) {

src/Overflow.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import { useBatchFrameState } from './hooks/useBatchFrameState';
77

88
const RESPONSIVE = 'responsive' as const;
99

10+
export type ComponentType =
11+
| React.ComponentType<any>
12+
| React.ForwardRefExoticComponent<any>
13+
| React.FC<any>
14+
| keyof React.ReactHTML;
15+
1016
export interface OverflowProps<ItemType> {
1117
prefixCls?: string;
1218
className?: string;
@@ -21,6 +27,8 @@ export interface OverflowProps<ItemType> {
2127
| React.ReactNode
2228
| ((omittedItems: ItemType[]) => React.ReactNode);
2329
suffix?: React.ReactNode;
30+
component?: ComponentType;
31+
itemComponent?: ComponentType;
2432
}
2533

2634
function defaultRenderRest<ItemType>(omittedItems: ItemType[]) {
@@ -42,6 +50,8 @@ function Overflow<ItemType = any>(
4250
maxCount,
4351
renderRest = defaultRenderRest,
4452
suffix,
53+
component: Component = 'div',
54+
itemComponent = 'div'
4555
} = props;
4656

4757
const createUseState = useBatchFrameState();
@@ -218,10 +228,15 @@ function Overflow<ItemType = any>(
218228
const itemSharedProps = {
219229
prefixCls: itemPrefixCls,
220230
responsive: isResponsive,
231+
component: itemComponent,
221232
};
222233

223234
let overflowNode = (
224-
<div className={classNames(prefixCls, className)} style={style} ref={ref}>
235+
<Component
236+
className={classNames(prefixCls, className)}
237+
style={style}
238+
ref={ref}
239+
>
225240
{mergedData.map((item, index) => {
226241
const key = getKey(item, index);
227242

@@ -268,7 +283,7 @@ function Overflow<ItemType = any>(
268283
{suffix}
269284
</Item>
270285
)}
271-
</div>
286+
</Component>
272287
);
273288

274289
if (isResponsive) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Overflow customize component 1`] = `
4+
<ul
5+
class="rc-overflow"
6+
>
7+
<li
8+
class="rc-overflow-item"
9+
style="opacity: 1;"
10+
>
11+
Label 0
12+
</li>
13+
</ul>
14+
`;

tests/index.spec.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ describe('Overflow', () => {
5757
<Overflow
5858
data={getData(6)}
5959
renderItem={renderItem}
60-
renderRest={omittedItems => `Bamboo: ${omittedItems.length}`}
60+
renderRest={(omittedItems) => `Bamboo: ${omittedItems.length}`}
6161
maxCount={3}
6262
/>,
6363
);
@@ -92,11 +92,25 @@ describe('Overflow', () => {
9292
<Overflow
9393
data={getData(1)}
9494
renderItem={renderItem}
95-
itemKey={item => `bamboo-${item.key}`}
95+
itemKey={(item) => `bamboo-${item.key}`}
9696
/>,
9797
);
9898

9999
expect(wrapper.find('Item').key()).toEqual('bamboo-k-0');
100100
});
101101
});
102+
103+
it('customize component', () => {
104+
const wrapper = mount(
105+
<Overflow
106+
data={getData(1)}
107+
renderItem={renderItem}
108+
itemKey={(item) => `bamboo-${item.key}`}
109+
component="ul"
110+
itemComponent="li"
111+
/>,
112+
);
113+
114+
expect(wrapper.render()).toMatchSnapshot();
115+
});
102116
});

0 commit comments

Comments
 (0)