使用 Formik 在 Chackra 中使用 NumberInput 挂钩
useNumberInput hook in Chackra with Formik
问题是由于某些原因,增加和减少按钮不会影响输入中的最终值,但是当您直接在输入中输入值时,值会发生变化。
import { Box, Button, FormControl, FormErrorMessage, FormLabel, HStack, Input, useNumberInput } from '@chakra-ui/react';
import { Field, useField } from 'formik';
import React from 'react';
interface TextInputProps{
name: string;
label: string;
}
const CountInput: React.FC<TextInputProps> = ({ name, label}) => {
const [field, { error, touched }] = useField(name);
const {
getInputProps,
getIncrementButtonProps,
getDecrementButtonProps,
} = useNumberInput({
step: 1,
defaultValue: 1,
min: 1,
max: 10,
precision: 0,
})
const inc = getIncrementButtonProps();
const dec = getDecrementButtonProps();
const input = getInputProps({ ...field });
return (
<Field name={name}>
{({ form }: any) => {
return (
<FormControl isInvalid={form.errors[name] && form.touched[name]}>
<FormLabel htmlFor={name}>{label}</FormLabel>
{description && <Box mb={5}>{description}</Box>}
<HStack maxW="320px">
<Button {...dec}>-</Button>
<Input id={name} onChange={(val) => form.setFieldValue(field.name, val)} {...input} />
<Button {...inc}>+</Button>
</HStack>
<FormErrorMessage>{form.errors[name]}</FormErrorMessage>
</FormControl>
);
}}
</Field>
);
}
export default CountInput;
我猜测问题出在将 属性 传播 ...field
传递给 getInputProps()
,这又会重置值。
字段内容是什么?
我也在尝试在 Chakra 中使用 useNumberInput 钩子,get input props 只接受一些值,这里是
export declare function useNumberInput(props?: UseNumberInputProps): {
value: React.ReactText;
valueAsNumber: number;
isFocused: boolean;
isDisabled: boolean | undefined;
isReadOnly: boolean | undefined;
getIncrementButtonProps: PropGetter<any, {}>;
getDecrementButtonProps: PropGetter<any, {}>;
getInputProps: PropGetter<any, {}>;
htmlProps: {
defaultValue?: string | number | undefined;
value?: string | number | undefined;
};
};
在 ...field
传播后将 onChange
传递给 useNumberInput
如下:
const [field, meta, helpers] = useField(name);
const { getInputProps, getIncrementButtonProps, getDecrementButtonProps } =
useNumberInput({
...field,
onChange: (valueAsString, valueAsNumber) => helpers.setValue(valueAsNumber),
});
因为 useNumberInput
的 onChange
参数需要
(method) UseCounterProps.onChange?(valueAsString: string, valueAsNumber: number): void
而 field
的 onChange
来自 useField
的签名不同。
问题是由于某些原因,增加和减少按钮不会影响输入中的最终值,但是当您直接在输入中输入值时,值会发生变化。
import { Box, Button, FormControl, FormErrorMessage, FormLabel, HStack, Input, useNumberInput } from '@chakra-ui/react';
import { Field, useField } from 'formik';
import React from 'react';
interface TextInputProps{
name: string;
label: string;
}
const CountInput: React.FC<TextInputProps> = ({ name, label}) => {
const [field, { error, touched }] = useField(name);
const {
getInputProps,
getIncrementButtonProps,
getDecrementButtonProps,
} = useNumberInput({
step: 1,
defaultValue: 1,
min: 1,
max: 10,
precision: 0,
})
const inc = getIncrementButtonProps();
const dec = getDecrementButtonProps();
const input = getInputProps({ ...field });
return (
<Field name={name}>
{({ form }: any) => {
return (
<FormControl isInvalid={form.errors[name] && form.touched[name]}>
<FormLabel htmlFor={name}>{label}</FormLabel>
{description && <Box mb={5}>{description}</Box>}
<HStack maxW="320px">
<Button {...dec}>-</Button>
<Input id={name} onChange={(val) => form.setFieldValue(field.name, val)} {...input} />
<Button {...inc}>+</Button>
</HStack>
<FormErrorMessage>{form.errors[name]}</FormErrorMessage>
</FormControl>
);
}}
</Field>
);
}
export default CountInput;
我猜测问题出在将 属性 传播 ...field
传递给 getInputProps()
,这又会重置值。
字段内容是什么?
我也在尝试在 Chakra 中使用 useNumberInput 钩子,get input props 只接受一些值,这里是
export declare function useNumberInput(props?: UseNumberInputProps): {
value: React.ReactText;
valueAsNumber: number;
isFocused: boolean;
isDisabled: boolean | undefined;
isReadOnly: boolean | undefined;
getIncrementButtonProps: PropGetter<any, {}>;
getDecrementButtonProps: PropGetter<any, {}>;
getInputProps: PropGetter<any, {}>;
htmlProps: {
defaultValue?: string | number | undefined;
value?: string | number | undefined;
};
};
在 ...field
传播后将 onChange
传递给 useNumberInput
如下:
const [field, meta, helpers] = useField(name);
const { getInputProps, getIncrementButtonProps, getDecrementButtonProps } =
useNumberInput({
...field,
onChange: (valueAsString, valueAsNumber) => helpers.setValue(valueAsNumber),
});
因为 useNumberInput
的 onChange
参数需要
(method) UseCounterProps.onChange?(valueAsString: string, valueAsNumber: number): void
而 field
的 onChange
来自 useField
的签名不同。