@@ -22,6 +22,11 @@ export interface SegmentedLabeledOption<ValueType = SegmentedRawOption> {
22
22
title ?: string ;
23
23
}
24
24
25
+ type ItemRender = (
26
+ node : React . ReactNode ,
27
+ info : { item : SegmentedLabeledOption } ,
28
+ ) => React . ReactNode ;
29
+
25
30
type SegmentedOptions < T = SegmentedRawOption > = (
26
31
| T
27
32
| SegmentedLabeledOption < T >
@@ -44,6 +49,7 @@ export interface SegmentedProps<ValueType = SegmentedValue>
44
49
name ?: string ;
45
50
classNames ?: Partial < Record < SemanticName , string > > ;
46
51
styles ?: Partial < Record < SemanticName , React . CSSProperties > > ;
52
+ itemRender ?: ItemRender ;
47
53
}
48
54
49
55
function getValidTitle ( option : SegmentedLabeledOption ) {
@@ -80,6 +86,7 @@ const InternalSegmentedOption: React.FC<{
80
86
style ?: React . CSSProperties ;
81
87
classNames ?: Partial < Record < SemanticName , string > > ;
82
88
styles ?: Partial < Record < SemanticName , React . CSSProperties > > ;
89
+ data : SegmentedLabeledOption ;
83
90
disabled ?: boolean ;
84
91
checked : boolean ;
85
92
label : React . ReactNode ;
@@ -95,12 +102,14 @@ const InternalSegmentedOption: React.FC<{
95
102
onKeyDown : ( e : React . KeyboardEvent ) => void ;
96
103
onKeyUp : ( e : React . KeyboardEvent ) => void ;
97
104
onMouseDown : ( ) => void ;
105
+ itemRender ?: ItemRender ;
98
106
} > = ( {
99
107
prefixCls,
100
108
className,
101
109
style,
102
110
styles,
103
111
classNames : segmentedClassNames ,
112
+ data,
104
113
disabled,
105
114
checked,
106
115
label,
@@ -113,15 +122,15 @@ const InternalSegmentedOption: React.FC<{
113
122
onKeyDown,
114
123
onKeyUp,
115
124
onMouseDown,
125
+ itemRender = ( node : React . ReactNode ) => node ,
116
126
} ) => {
117
127
const handleChange = ( event : React . ChangeEvent < HTMLInputElement > ) => {
118
128
if ( disabled ) {
119
129
return ;
120
130
}
121
131
onChange ( event , value ) ;
122
132
} ;
123
-
124
- return (
133
+ const itemContent : React . ReactNode = (
125
134
< label
126
135
className = { classNames ( className , {
127
136
[ `${ prefixCls } -item-disabled` ] : disabled ,
@@ -155,6 +164,7 @@ const InternalSegmentedOption: React.FC<{
155
164
</ div >
156
165
</ label >
157
166
) ;
167
+ return itemRender ( itemContent , { item : data } ) ;
158
168
} ;
159
169
160
170
const Segmented = React . forwardRef < HTMLDivElement , SegmentedProps > (
@@ -174,6 +184,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
174
184
styles,
175
185
classNames : segmentedClassNames ,
176
186
motionName = 'thumb-motion' ,
187
+ itemRender,
177
188
...restProps
178
189
} = props ;
179
190
@@ -258,6 +269,54 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
258
269
break ;
259
270
}
260
271
} ;
272
+
273
+ const renderOption = ( segmentedOption : SegmentedLabeledOption ) => {
274
+ const {
275
+ label,
276
+ value : optionValue ,
277
+ disabled : optionDisabled ,
278
+ title,
279
+ } = segmentedOption ;
280
+ const optionData : SegmentedLabeledOption = {
281
+ label,
282
+ value : optionValue ,
283
+ disabled : optionDisabled ,
284
+ title,
285
+ } ;
286
+ return (
287
+ < InternalSegmentedOption
288
+ { ...segmentedOption }
289
+ name = { name }
290
+ data = { optionData }
291
+ itemRender = { itemRender }
292
+ key = { optionValue }
293
+ prefixCls = { prefixCls }
294
+ className = { classNames (
295
+ segmentedOption . className ,
296
+ `${ prefixCls } -item` ,
297
+ segmentedClassNames ?. item ,
298
+ {
299
+ [ `${ prefixCls } -item-selected` ] :
300
+ optionValue === rawValue && ! thumbShow ,
301
+ [ `${ prefixCls } -item-focused` ] :
302
+ isFocused && isKeyboard && optionValue === rawValue ,
303
+ } ,
304
+ ) }
305
+ style = { styles ?. item }
306
+ classNames = { segmentedClassNames }
307
+ styles = { styles }
308
+ checked = { optionValue === rawValue }
309
+ onChange = { handleChange }
310
+ onFocus = { handleFocus }
311
+ onBlur = { handleBlur }
312
+ onKeyDown = { handleKeyDown }
313
+ onKeyUp = { handleKeyUp }
314
+ onMouseDown = { handleMouseDown }
315
+ disabled = { ! ! disabled || ! ! optionDisabled }
316
+ />
317
+ ) ;
318
+ } ;
319
+
261
320
return (
262
321
< div
263
322
role = "radiogroup"
@@ -294,38 +353,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
294
353
setThumbShow ( false ) ;
295
354
} }
296
355
/>
297
- { segmentedOptions . map ( ( segmentedOption ) => (
298
- < InternalSegmentedOption
299
- { ...segmentedOption }
300
- name = { name }
301
- key = { segmentedOption . value }
302
- prefixCls = { prefixCls }
303
- className = { classNames (
304
- segmentedOption . className ,
305
- `${ prefixCls } -item` ,
306
- segmentedClassNames ?. item ,
307
- {
308
- [ `${ prefixCls } -item-selected` ] :
309
- segmentedOption . value === rawValue && ! thumbShow ,
310
- [ `${ prefixCls } -item-focused` ] :
311
- isFocused &&
312
- isKeyboard &&
313
- segmentedOption . value === rawValue ,
314
- } ,
315
- ) }
316
- style = { styles ?. item }
317
- classNames = { segmentedClassNames }
318
- styles = { styles }
319
- checked = { segmentedOption . value === rawValue }
320
- onChange = { handleChange }
321
- onFocus = { handleFocus }
322
- onBlur = { handleBlur }
323
- onKeyDown = { handleKeyDown }
324
- onKeyUp = { handleKeyUp }
325
- onMouseDown = { handleMouseDown }
326
- disabled = { ! ! disabled || ! ! segmentedOption . disabled }
327
- />
328
- ) ) }
356
+ { segmentedOptions . map ( renderOption ) }
329
357
</ div >
330
358
</ div >
331
359
) ;
0 commit comments