fix: number input (#6698)

This commit is contained in:
Ryo
2026-04-01 18:24:31 +08:00
committed by GitHub
parent fbbe852596
commit e382a74e62
@@ -21,28 +21,6 @@ type Props = Omit<NumberInputProps, 'onChange' | 'onBlur'> & {
hideStepper?: boolean; hideStepper?: boolean;
}; };
const getSafeNumberValue = (value: unknown) => {
if (value === '' || value === null || value === undefined) {
return undefined;
}
if (typeof value === 'number') {
return Number.isFinite(value) ? value : undefined;
}
if (typeof value === 'string') {
const trimmedValue = value.trim();
if (!trimmedValue) {
return undefined;
}
const parsedValue = Number(trimmedValue);
return Number.isFinite(parsedValue) ? parsedValue : undefined;
}
return undefined;
};
const MyNumberInput = (props: Props) => { const MyNumberInput = (props: Props) => {
const { const {
register, register,
@@ -52,62 +30,60 @@ const MyNumberInput = (props: Props) => {
placeholder, placeholder,
inputFieldProps, inputFieldProps,
hideStepper = false, hideStepper = false,
value,
...restProps ...restProps
} = props; } = props;
const registeredField =
register && name
? register(name, {
required: props.isRequired,
min: props.min,
max: props.max,
setValueAs: (value) => getSafeNumberValue(value)
})
: undefined;
const inputFieldRegisterProps = registeredField
? {
name: registeredField.name,
ref: registeredField.ref
}
: undefined;
const safeControlledValue =
value === '' ? '' : typeof value === 'undefined' ? undefined : getSafeNumberValue(value) ?? '';
const getRegisteredValue = (value: unknown) => {
const safeValue = getSafeNumberValue(value);
if (typeof safeValue === 'number') {
return safeValue;
}
return '';
};
return ( return (
<NumberInput <NumberInput
{...restProps} {...restProps}
{...(typeof value !== 'undefined' ? { value: safeControlledValue } : {})}
onBlur={(e) => { onBlur={(e) => {
const numE = getSafeNumberValue(e.target.value); const numE = e.target.value === '' ? '' : Number(e.target.value);
onBlur?.(numE); if (onBlur) {
onChange?.(numE); if (numE === '') {
// @ts-ignore
if (registeredField && name) { onBlur('');
const registeredValue = getRegisteredValue(e.target.value); } else {
const target = { onBlur(numE);
name, }
value: registeredValue }
if (onChange) {
if (numE === '') {
// @ts-ignore
onChange('');
} else {
onChange(numE);
}
}
if (register && name) {
const event = {
target: {
name,
value: numE
}
}; };
registeredField.onChange({ register(name).onBlur(event);
target, }
type: 'change' }}
}); onChange={(e) => {
registeredField.onBlur({ const numE = e === '' ? '' : e.endsWith('.') || /^\d+\.0+$/.test(e) ? e : Number(e);
target, if (onChange) {
type: 'blur' if (numE === '') {
}); // @ts-ignore
onChange('');
} else {
// @ts-ignore
onChange(numE);
}
}
if (register && name) {
const event = {
target: {
name,
value: numE
}
};
register(name).onChange(event);
} }
}} }}
> >
@@ -115,7 +91,14 @@ const MyNumberInput = (props: Props) => {
placeholder={placeholder} placeholder={placeholder}
h={restProps.h} h={restProps.h}
defaultValue={restProps.defaultValue} defaultValue={restProps.defaultValue}
{...(inputFieldRegisterProps || {})} {...(register && name
? register(name, {
required: props.isRequired,
min: props.min,
max: props.max,
valueAsNumber: true
})
: {})}
{...inputFieldProps} {...inputFieldProps}
/> />
{!hideStepper && ( {!hideStepper && (