如何将 React 挂钩表单与 NumberFormat(react-number-format)集成?
How do I integrate React hook form with NumberFormat (react-number-format)?
我正在尝试在没有控制器且没有 ReactDOM.findDOMNode 的情况下使用带有 NumberFormat 的 React 钩子形式(已弃用和不鼓励)。以下代码有效
import React from 'react';
import ReactDOM from 'react-dom';
import { useForm } from 'react-hook-form';
import NumberFormat from 'react-number-format';
function FormWorking() {
const { register, handleSubmit, getValues } = useForm();
function onSubmit() {
console.log(getValues());
}
const cardNumberReg = register('cardNumber');
return (
<form onSubmit={handleSubmit(onSubmit)}>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={(inst) => (cardNumberReg.ref(ReactDOM.findDOMNode(inst)))}
/>
</form>
);
}
ReactDOM.render(
<FormWorking />, document.getElementById('root')
);
但我不想使用 findDOMNode。 None 以下尝试有效(cardNumber 在日志中为空或未定义)
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
getInputRef={(e: any) => (cardNumberReg.ref(e))}
/>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={cardNumberReg.ref}
/>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={(e) => cardNumberReg.ref(e)}
/>
我是 React 新手,如有任何帮助,我们将不胜感激。
我对此的看法是使用 React 钩子形式的 Controller 组件,在这种情况下,您将 NumberFormat 作为受控组件处理,您需要执行以下操作:
import { useForm, Controller } from "react-hook-form";
import NumberFormat from "react-number-format";
export default function App() {
const {
control,
handleSubmit,
formState: { errors }
} = useForm();
const onSubmit = (data) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
control={control}
name="cardNumber"
render={({ field: { onChange, name, value } }) => (
<NumberFormat
format="#### #### #### ####"
name={name}
value={value}
onChange={onChange}
/>
)}
/>
<input type="submit" />
</form>
);
}
基本上你需要传递来自 useForm() 函数的控制值并给控制器一个名字,在你的例子中是 cardNumber,之后你将在控制器中使用一个渲染函数,你的 NumberFormat 控制器将使用时,请注意 render prop 是一个函数,它为您提供所有必要的值以使您的输入有效,例如 onChange、值和名称。您可以查看 docs 以查看所有可用的道具。
请记住,通常您希望对每个输入都使用寄存器功能,但在某些情况下 UI 库使用控制器来控制输入是最好的主意
还有一个 sandbox 和一个工作示例。
我正在尝试在没有控制器且没有 ReactDOM.findDOMNode 的情况下使用带有 NumberFormat 的 React 钩子形式(已弃用和不鼓励)。以下代码有效
import React from 'react';
import ReactDOM from 'react-dom';
import { useForm } from 'react-hook-form';
import NumberFormat from 'react-number-format';
function FormWorking() {
const { register, handleSubmit, getValues } = useForm();
function onSubmit() {
console.log(getValues());
}
const cardNumberReg = register('cardNumber');
return (
<form onSubmit={handleSubmit(onSubmit)}>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={(inst) => (cardNumberReg.ref(ReactDOM.findDOMNode(inst)))}
/>
</form>
);
}
ReactDOM.render(
<FormWorking />, document.getElementById('root')
);
但我不想使用 findDOMNode。 None 以下尝试有效(cardNumber 在日志中为空或未定义)
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
getInputRef={(e: any) => (cardNumberReg.ref(e))}
/>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={cardNumberReg.ref}
/>
<NumberFormat
format="#### #### #### ####"
{...cardNumberReg}
ref={(e) => cardNumberReg.ref(e)}
/>
我是 React 新手,如有任何帮助,我们将不胜感激。
我对此的看法是使用 React 钩子形式的 Controller 组件,在这种情况下,您将 NumberFormat 作为受控组件处理,您需要执行以下操作:
import { useForm, Controller } from "react-hook-form";
import NumberFormat from "react-number-format";
export default function App() {
const {
control,
handleSubmit,
formState: { errors }
} = useForm();
const onSubmit = (data) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
control={control}
name="cardNumber"
render={({ field: { onChange, name, value } }) => (
<NumberFormat
format="#### #### #### ####"
name={name}
value={value}
onChange={onChange}
/>
)}
/>
<input type="submit" />
</form>
);
}
基本上你需要传递来自 useForm() 函数的控制值并给控制器一个名字,在你的例子中是 cardNumber,之后你将在控制器中使用一个渲染函数,你的 NumberFormat 控制器将使用时,请注意 render prop 是一个函数,它为您提供所有必要的值以使您的输入有效,例如 onChange、值和名称。您可以查看 docs 以查看所有可用的道具。
请记住,通常您希望对每个输入都使用寄存器功能,但在某些情况下 UI 库使用控制器来控制输入是最好的主意
还有一个 sandbox 和一个工作示例。