Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export interface SegmentedProps<ValueType = SegmentedValue>
name?: string;
classNames?: Partial<Record<SemanticName, string>>;
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
itemRender?: (node: React.ReactNode) => React.ReactNode;
}

function getValidTitle(option: SegmentedLabeledOption) {
Expand Down Expand Up @@ -86,6 +87,7 @@ const InternalSegmentedOption: React.FC<{
title?: string;
value: SegmentedRawOption;
name?: string;
itemRender?: (node: React.ReactNode) => React.ReactNode;
onChange: (
e: React.ChangeEvent<HTMLInputElement>,
value: SegmentedRawOption,
Expand All @@ -107,6 +109,7 @@ const InternalSegmentedOption: React.FC<{
title,
value,
name,
itemRender = (node: React.ReactNode) => node,
onChange,
onFocus,
onBlur,
Expand All @@ -120,8 +123,7 @@ const InternalSegmentedOption: React.FC<{
}
onChange(event, value);
};

return (
const ItemContent = (
<label
className={classNames(className, {
[`${prefixCls}-item-disabled`]: disabled,
Expand Down Expand Up @@ -155,6 +157,7 @@ const InternalSegmentedOption: React.FC<{
</div>
</label>
);
return itemRender(ItemContent);
};

const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
Expand All @@ -174,6 +177,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
styles,
classNames: segmentedClassNames,
motionName = 'thumb-motion',
itemRender,
...restProps
} = props;

Expand Down Expand Up @@ -298,6 +302,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
<InternalSegmentedOption
{...segmentedOption}
name={name}
itemRender={itemRender}
key={segmentedOption.value}
prefixCls={prefixCls}
className={classNames(
Expand Down
19 changes: 19 additions & 0 deletions tests/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -799,4 +799,23 @@ describe('Segmented keyboard navigation', () => {
expect(itemElement.style.color).toBe('yellow');
expect(labelElement.style.backgroundColor).toBe('black');
});
describe('itemRender', () => {
it('When "itemRender" is not configured, render the original "label"', () => {
const { container } = render(
<Segmented options={['iOS', 'Android', 'Web']} />,
);
const label = container.querySelector('.rc-segmented-item-label');
expect(label).toHaveTextContent('iOS');
});
it('Configure "itemRender" to render the return value', () => {
const { container } = render(
<Segmented
options={['iOS', 'Android', 'Web']}
itemRender={(node) => <div className="test-title">{node}</div>}
/>,
);
const labels = container.querySelectorAll('.test-title');
expect(labels).toHaveLength(3);
});
});
});