time-picker: simple optimization

pull/8342/head
chentanghui 2025-09-01 07:47:06 +08:00
parent 723bb47a42
commit d0a0f9f8bc
1 changed files with 54 additions and 58 deletions

View File

@ -77,6 +77,34 @@ function createTimePicker<
}); });
const { TimePicker: InternalTimePicker, RangePicker: InternalRangePicker } = DatePicker as any; const { TimePicker: InternalTimePicker, RangePicker: InternalRangePicker } = DatePicker as any;
const usePickerExpose = (pickerRef: Ref) => ({
focus: () => pickerRef.value?.focus?.(),
blur: () => pickerRef.value?.blur?.(),
});
const useFormItemEvents = (emit: any, formItemContext: any) => ({
onChange: (value: any, dateString: any) => {
emit('update:value', value);
emit('change', value, dateString);
formItemContext.onFieldChange();
},
onBlur: (e: FocusEvent) => {
emit('blur', e);
formItemContext.onFieldBlur();
}
});
const useCommonEvents = (emit: any) => ({
onOpenChange: (open: boolean) => {
emit('update:open', open);
emit('openChange', open);
},
onFocus: (e: FocusEvent) => {
emit('focus', e);
}
});
const TimePicker = defineComponent<DTimePickerProps>({ const TimePicker = defineComponent<DTimePickerProps>({
name: 'ATimePicker', name: 'ATimePicker',
inheritAttrs: false, inheritAttrs: false,
@ -96,53 +124,37 @@ function createTimePicker<
setup(p, { slots, expose, emit, attrs }) { setup(p, { slots, expose, emit, attrs }) {
const props = p as unknown as DTimePickerProps; const props = p as unknown as DTimePickerProps;
const formItemContext = useInjectFormItemContext(); const formItemContext = useInjectFormItemContext();
const pickerRef = ref();
devWarning( devWarning(
!(slots.addon || props.addon), !(slots.addon || props.addon),
'TimePicker', 'TimePicker',
'`addon` is deprecated. Please use `v-slot:renderExtraFooter` instead.', '`addon` is deprecated. Please use `v-slot:renderExtraFooter` instead.',
); );
const pickerRef = ref();
expose({ expose(usePickerExpose(pickerRef));
focus: () => {
pickerRef.value?.focus(); const { onChange, onBlur } = useFormItemEvents(emit, formItemContext);
}, const { onOpenChange, onFocus } = useCommonEvents(emit);
blur: () => {
pickerRef.value?.blur();
},
});
const onChange = (value: DateType | string, dateString: string) => {
emit('update:value', value);
emit('change', value, dateString);
formItemContext.onFieldChange();
};
const onOpenChange = (open: boolean) => {
emit('update:open', open);
emit('openChange', open);
};
const onFocus = (e: FocusEvent) => {
emit('focus', e);
};
const onBlur = (e: FocusEvent) => {
emit('blur', e);
formItemContext.onFieldBlur();
};
const onOk = (value: DateType) => { const onOk = (value: DateType) => {
emit('ok', value); emit('ok', value);
}; };
return () => { return () => {
const { id = formItemContext.id.value } = props; const { id = formItemContext.id.value } = props;
//restProps.addon const renderExtraFooter = props.addon || slots.addon || props.renderExtraFooter || slots.renderExtraFooter;
const omittedProps = omit(props, ['onUpdate:value', 'onUpdate:open']);
return ( return (
<InternalTimePicker <InternalTimePicker
{...attrs} {...attrs}
{...omit(props, ['onUpdate:value', 'onUpdate:open'])} {...omittedProps}
id={id} id={id}
dropdownClassName={props.popupClassName} dropdownClassName={props.popupClassName}
mode={undefined} mode={undefined}
ref={pickerRef} ref={pickerRef}
renderExtraFooter={ renderExtraFooter={renderExtraFooter}
props.addon || slots.addon || props.renderExtraFooter || slots.renderExtraFooter
}
onChange={onChange} onChange={onChange}
onOpenChange={onOpenChange} onOpenChange={onOpenChange}
onFocus={onFocus} onFocus={onFocus}
@ -174,42 +186,23 @@ function createTimePicker<
const props = p as unknown as DTimeRangePickerProps; const props = p as unknown as DTimeRangePickerProps;
const pickerRef = ref(); const pickerRef = ref();
const formItemContext = useInjectFormItemContext(); const formItemContext = useInjectFormItemContext();
expose({
focus: () => { expose(usePickerExpose(pickerRef));
pickerRef.value?.focus();
}, const { onChange, onBlur } = useFormItemEvents(emit, formItemContext);
blur: () => { const { onOpenChange, onFocus } = useCommonEvents(emit);
pickerRef.value?.blur();
},
});
const onChange = (
values: RangeValue<string> | RangeValue<DateType>,
dateStrings: [string, string],
) => {
emit('update:value', values);
emit('change', values, dateStrings);
formItemContext.onFieldChange();
};
const onOpenChange = (open: boolean) => {
emit('update:open', open);
emit('openChange', open);
};
const onFocus = (e: FocusEvent) => {
emit('focus', e);
};
const onBlur = (e: FocusEvent) => {
emit('blur', e);
formItemContext.onFieldBlur();
};
const onPanelChange = ( const onPanelChange = (
values: RangeValue<string> | RangeValue<DateType>, values: RangeValue<string> | RangeValue<DateType>,
modes: [PanelMode, PanelMode], modes: [PanelMode, PanelMode],
) => { ) => {
emit('panelChange', values, modes); emit('panelChange', values, modes);
}; };
const onOk = (values: RangeValue<string | DateType>) => { const onOk = (values: RangeValue<string | DateType>) => {
emit('ok', values); emit('ok', values);
}; };
const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = ( const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = (
values: RangeValue<string> | RangeValue<DateType>, values: RangeValue<string> | RangeValue<DateType>,
dateStrings: [string, string], dateStrings: [string, string],
@ -217,12 +210,15 @@ function createTimePicker<
) => { ) => {
emit('calendarChange', values, dateStrings, info); emit('calendarChange', values, dateStrings, info);
}; };
return () => { return () => {
const { id = formItemContext.id.value } = props; const { id = formItemContext.id.value } = props;
const omittedProps = omit(props, ['onUpdate:open', 'onUpdate:value'] as any);
return ( return (
<InternalRangePicker <InternalRangePicker
{...attrs} {...attrs}
{...omit(props, ['onUpdate:open', 'onUpdate:value'] as any)} {...omittedProps}
id={id} id={id}
dropdownClassName={props.popupClassName} dropdownClassName={props.popupClassName}
picker="time" picker="time"