如何在 react-hook-form 中只输入数字
How to input only number in react-hook-form
我正在为我的输入组件使用 react-hook-form,但有一个问题。在某些文本字段中,例如,仅接受数字的用于验证的文本字段,我不知道该怎么做,对于正常的textInput
,我们可以使用正则表达式,例如
const [numberInput, setNumberInput] = useState("")
function onTextChanged(value) {
setNumberInput(value.replace(/[^0-9]/, ""))
}
并将该函数和挂钩值分别放在 onTextChange
和 value
上,我在 react-hook-form 上尝试了上面相同的方法,但它不起作用!我仍然可以输入其他字符,如“+”或“-”,当然使用数字键盘
所以这是 TextField 组件
export interface HTextFieldProps extends TextFieldProps {
control: Control<any>
name: string
defaultValue?: string
}
/**
* Describe your component here
*/
export const HTextField = function HookformTextField(props: HTextFieldProps) {
const { name, control, defaultValue = "", ...restProps } = props
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChangeText={onChange}
value={value}
defaultValue={defaultValue}
error={(error && error.message) as TxKeyPath}
/>
)}
defaultValue={defaultValue}
/>
)
}
这是我使用它的时候
<HTextField
onChangeText={(value) => onTextChanged(value)}
value={numberInput}
name={"times"}
control={control}
autoCapitalize="none"
keyboardType={Platform.OS === "android" ? "numeric" : "number-pad"}
returnKeyType="done"
inputStyle={INPUT_STYLE}
required
/>
那么我如何才能在 react-hook-form 中只使用数字,看起来像这样,非常感谢
使用这样的东西
const allowOnlyNumber=(value)=>{
return value.replace(/[^0-9]/g, '')
}
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChangeText={(text)=>onChange(allowOnlyNumber(text))}
value={value}
defaultValue={defaultValue}
error={(error && error.message) as TxKeyPath}
/>
)}
defaultValue={defaultValue}
/>
)
仅整数的解决方案
您可以将 <TextField />
prop type
设置为 number
,然后将只允许数字。
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChange={onChange}
value={value}
fullWidth
label="Times"
defaultValue={defaultValue}
type="number"
error={error && error.message}
/>
)}
defaultValue={defaultValue}
/>
前导零或指数的解决方案
正如此处评论中所指出的那样,该版本还通过使用 RHF 的验证函数接受前导零或指数表示法。
const validate = (value: string) => {
const matches = value.match(
/^(?:0\.(?:0[0-9]|[0-9]\d?)|[0-9]\d*(?:\.\d{1,2})?)(?:e[+-]?\d+)?$/
);
return matches?.length > 0 || "Not a Number";
};
return (
<Controller
control={control}
name={name}
rules={{ validate }}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChange={onChange}
value={value}
fullWidth
label="Times"
error={!!error}
/>
)}
defaultValue={defaultValue}
/>
);
使用 react-hook-form v7 这对我有用:
<input {...register('age', {
pattern: {
value: /^[0-9]+$/,
message: 'Please enter a number',
},
})} />
查看文档 (V7):https://react-hook-form.com/api/useform/register
<input
type="number"
{...register("test", {
valueAsNumber: true,
})}
/>
如果不使用type="number"
<input
{...register("test", {
valueAsNumber: true,
pattern:{
value: /^(0|[1-9]\d*)(\.\d+)?$/
},
})}
/>
您仍然可以使用 validate
。
<input
{...register("test", {
valueAsNumber: true,
validate: (value) => value > 0,
})}
/>
我正在为我的输入组件使用 react-hook-form,但有一个问题。在某些文本字段中,例如,仅接受数字的用于验证的文本字段,我不知道该怎么做,对于正常的textInput
,我们可以使用正则表达式,例如
const [numberInput, setNumberInput] = useState("")
function onTextChanged(value) {
setNumberInput(value.replace(/[^0-9]/, ""))
}
并将该函数和挂钩值分别放在 onTextChange
和 value
上,我在 react-hook-form 上尝试了上面相同的方法,但它不起作用!我仍然可以输入其他字符,如“+”或“-”,当然使用数字键盘
所以这是 TextField 组件
export interface HTextFieldProps extends TextFieldProps {
control: Control<any>
name: string
defaultValue?: string
}
/**
* Describe your component here
*/
export const HTextField = function HookformTextField(props: HTextFieldProps) {
const { name, control, defaultValue = "", ...restProps } = props
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChangeText={onChange}
value={value}
defaultValue={defaultValue}
error={(error && error.message) as TxKeyPath}
/>
)}
defaultValue={defaultValue}
/>
)
}
这是我使用它的时候
<HTextField
onChangeText={(value) => onTextChanged(value)}
value={numberInput}
name={"times"}
control={control}
autoCapitalize="none"
keyboardType={Platform.OS === "android" ? "numeric" : "number-pad"}
returnKeyType="done"
inputStyle={INPUT_STYLE}
required
/>
那么我如何才能在 react-hook-form 中只使用数字,看起来像这样,非常感谢
使用这样的东西
const allowOnlyNumber=(value)=>{
return value.replace(/[^0-9]/g, '')
}
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChangeText={(text)=>onChange(allowOnlyNumber(text))}
value={value}
defaultValue={defaultValue}
error={(error && error.message) as TxKeyPath}
/>
)}
defaultValue={defaultValue}
/>
)
仅整数的解决方案
您可以将 <TextField />
prop type
设置为 number
,然后将只允许数字。
<Controller
control={control}
name={name}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChange={onChange}
value={value}
fullWidth
label="Times"
defaultValue={defaultValue}
type="number"
error={error && error.message}
/>
)}
defaultValue={defaultValue}
/>
前导零或指数的解决方案
正如此处评论中所指出的那样,该版本还通过使用 RHF 的验证函数接受前导零或指数表示法。
const validate = (value: string) => {
const matches = value.match(
/^(?:0\.(?:0[0-9]|[0-9]\d?)|[0-9]\d*(?:\.\d{1,2})?)(?:e[+-]?\d+)?$/
);
return matches?.length > 0 || "Not a Number";
};
return (
<Controller
control={control}
name={name}
rules={{ validate }}
render={({ field: { onChange, value }, fieldState: { error } }) => (
<TextField
{...restProps}
onChange={onChange}
value={value}
fullWidth
label="Times"
error={!!error}
/>
)}
defaultValue={defaultValue}
/>
);
使用 react-hook-form v7 这对我有用:
<input {...register('age', {
pattern: {
value: /^[0-9]+$/,
message: 'Please enter a number',
},
})} />
查看文档 (V7):https://react-hook-form.com/api/useform/register
<input
type="number"
{...register("test", {
valueAsNumber: true,
})}
/>
如果不使用type="number"
<input
{...register("test", {
valueAsNumber: true,
pattern:{
value: /^(0|[1-9]\d*)(\.\d+)?$/
},
})}
/>
您仍然可以使用 validate
。
<input
{...register("test", {
valueAsNumber: true,
validate: (value) => value > 0,
})}
/>