Skip to content

Commit daedf88

Browse files
authored
feat: support name prop to enable grouping (#284)
* feat: support prop to enable grouping * add test
1 parent 6bedd52 commit daedf88

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed

docs/demo/name.tsx

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Segmented from 'rc-segmented';
2+
import React from 'react';
3+
import '../../assets/style.less';
4+
5+
export default function App() {
6+
return (
7+
<div>
8+
<div className="wrapper">
9+
<Segmented
10+
name="group"
11+
options={['iOS', 'Android', 'Web']}
12+
onChange={(value) => console.log(value, typeof value)}
13+
/>
14+
</div>
15+
</div>
16+
);
17+
}

docs/example.md

+4
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ nav:
3232
## rtl
3333

3434
<code src="./demo/rtl.tsx"></code>
35+
36+
## name
37+
38+
<code src="./demo/name.tsx"></code>

src/index.tsx

+6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export interface SegmentedProps<ValueType = SegmentedValue>
4040
direction?: 'ltr' | 'rtl';
4141
motionName?: string;
4242
vertical?: boolean;
43+
name?: string;
4344
}
4445

4546
function getValidTitle(option: SegmentedLabeledOption) {
@@ -78,6 +79,7 @@ const InternalSegmentedOption: React.FC<{
7879
label: React.ReactNode;
7980
title?: string;
8081
value: SegmentedRawOption;
82+
name?: string;
8183
onChange: (
8284
e: React.ChangeEvent<HTMLInputElement>,
8385
value: SegmentedRawOption,
@@ -90,6 +92,7 @@ const InternalSegmentedOption: React.FC<{
9092
label,
9193
title,
9294
value,
95+
name,
9396
onChange,
9497
}) => {
9598
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
@@ -106,6 +109,7 @@ const InternalSegmentedOption: React.FC<{
106109
})}
107110
>
108111
<input
112+
name={name}
109113
className={`${prefixCls}-item-input`}
110114
aria-hidden="true"
111115
type="radio"
@@ -135,6 +139,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
135139
disabled,
136140
defaultValue,
137141
value,
142+
name,
138143
onChange,
139144
className = '',
140145
motionName = 'thumb-motion',
@@ -208,6 +213,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
208213
{segmentedOptions.map((segmentedOption) => (
209214
<InternalSegmentedOption
210215
{...segmentedOption}
216+
name={name}
211217
key={segmentedOption.value}
212218
prefixCls={prefixCls}
213219
className={classNames(

tests/index.test.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -650,4 +650,17 @@ describe('rc-segmented', () => {
650650

651651
offsetParentSpy.mockRestore();
652652
});
653+
654+
it('all children should have a name property', () => {
655+
const GROUP_NAME = 'GROUP_NAME';
656+
const { container } = render(
657+
<Segmented options={['iOS', 'Android', 'Web']} name={GROUP_NAME} />,
658+
);
659+
660+
container
661+
.querySelectorAll<HTMLInputElement>('input[type="radio"]')
662+
.forEach((el) => {
663+
expect(el.name).toEqual(GROUP_NAME);
664+
});
665+
});
653666
});

0 commit comments

Comments
 (0)