@@ -52,6 +52,8 @@ export interface RangePickerSharedProps<DateType> {
5252 value : RangeValue < DateType > ,
5353 formatString : [ string , string ] ,
5454 ) => void ;
55+ onFocus ?: React . FocusEventHandler < HTMLInputElement > ;
56+ onBlur ?: React . FocusEventHandler < HTMLInputElement > ;
5557}
5658
5759type OmitPickerProps < Props > = Omit <
@@ -93,7 +95,11 @@ interface MergedRangePickerProps<DateType>
9395 picker ?: PickerMode ;
9496}
9597
96- function RangePicker < DateType > ( props : RangePickerProps < DateType > ) {
98+ function InternalRangePicker < DateType > (
99+ props : RangePickerProps < DateType > & {
100+ pickerRef : React . Ref < Picker > ;
101+ } ,
102+ ) {
97103 const {
98104 prefixCls = 'rc-picker' ,
99105 className,
@@ -103,6 +109,7 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
103109 defaultPickerValue,
104110 separator = '~' ,
105111 picker,
112+ pickerRef,
106113 locale,
107114 generateConfig,
108115 placeholder,
@@ -116,7 +123,11 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
116123 disabled,
117124 onChange,
118125 onCalendarChange,
119- } = props as MergedRangePickerProps < DateType > ;
126+ onFocus,
127+ onBlur,
128+ } = props as MergedRangePickerProps < DateType > & {
129+ pickerRef : React . Ref < Picker > ;
130+ } ;
120131
121132 const formatList = toArray (
122133 getDefaultFormat ( format , picker , showTime , use12Hours ) ,
@@ -188,10 +199,12 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
188199 } ;
189200
190201 // ============================= Change =============================
191- const formatDate = ( date : NullableDateType < DateType > ) =>
192- ( date
193- ? generateConfig . locale . format ( locale . locale , date , formatList [ 0 ] )
194- : '' ) ;
202+ const formatDate = ( date : NullableDateType < DateType > ) => {
203+ if ( date ) {
204+ return generateConfig . locale . format ( locale . locale , date , formatList [ 0 ] ) ;
205+ }
206+ return '' ;
207+ } ;
195208
196209 const onInternalChange = (
197210 values : NullableDateType < DateType > [ ] ,
@@ -306,6 +319,7 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
306319 >
307320 < Picker < DateType >
308321 { ...pickerProps }
322+ ref = { pickerRef }
309323 prefixCls = { prefixCls }
310324 value = { value1 }
311325 placeholder = { placeholder && placeholder [ 0 ] }
@@ -317,6 +331,8 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
317331 onInternalChange ( [ date , value2 ] , true ) ;
318332 } }
319333 onSelect = { onStartSelect }
334+ onFocus = { onFocus }
335+ onBlur = { onBlur }
320336 />
321337 { separator }
322338 < Picker < DateType >
@@ -332,10 +348,40 @@ function RangePicker<DateType>(props: RangePickerProps<DateType>) {
332348 onInternalChange ( [ value1 , date ] , false ) ;
333349 } }
334350 onSelect = { onEndSelect }
351+ onFocus = { onFocus }
352+ onBlur = { onBlur }
335353 />
336354 </ div >
337355 </ RangeContext . Provider >
338356 ) ;
339357}
340358
359+ // Wrap with class component to enable pass generic with instance method
360+ class RangePicker < DateType > extends React . Component <
361+ RangePickerProps < DateType >
362+ > {
363+ pickerRef = React . createRef < HTMLInputElement > ( ) ;
364+
365+ focus = ( ) => {
366+ if ( this . pickerRef . current ) {
367+ this . pickerRef . current . focus ( ) ;
368+ }
369+ } ;
370+
371+ blur = ( ) => {
372+ if ( this . pickerRef . current ) {
373+ this . pickerRef . current . blur ( ) ;
374+ }
375+ } ;
376+
377+ render ( ) {
378+ return (
379+ < InternalRangePicker < DateType >
380+ { ...this . props }
381+ pickerRef = { this . pickerRef }
382+ />
383+ ) ;
384+ }
385+ }
386+
341387export default RangePicker ;
0 commit comments