reactjs - 如何从 react-datepicker 获取日期值以注册 react-hook-form
问题描述
我正在使用 react-datepicker 和 react-hook-form 制作带有所需生日字段的注册表单。单击 onSubmit 按钮后,所有数据都记录在控制台中,除了birthDate(为空)。如何从 react-datepicker 获取日期值以注册 react-hook-form?
注册表单界面
export interface RegistrationForm {
username: string;
birthDate: Date;
email: string;
password: string;
passwordConfirm: string;
}
const {register, handleSubmit, formState: {errors}, watch, control } = useForm<RegistrationForm>()
const onSubmit = async (data: RegistrationForm) => {
console.log(data)
}
const [selectedBirthDate, setSelectedBirthDate] = useState<Date>(new Date())
const handleDateChange = (date: Date | null) => {
if(date != null) {
setSelectedBirthDate(date)
}
}
在我的控制器标签中
<Controller
name={"birthDate"}
control={control}
defaultValue={selectedBirthDate}
render={({field}) => {
return(
<DatePicker
onChange={(date: Date) => handleDateChange(date)}
selected={selectedBirthDate}
placeholderText="Enter your birth date"
/>
)
}}
/>
用户名表格
<input
type="text"
placeholder="username"
{...register("username", {
required: true,
maxLength: 20,
minLength: 5
})}
/>
解决方案
您忘记将您的<Controller />
与<DatePicker />
组件链接起来。因此,至少使用value
并将onChange
其传递给<DatePicker />
道具很重要。
<Controller
name={"birthDate"}
control={control}
defaultValue={new Date()}
render={({ field: { onChange, value } }) => {
return (
<DatePicker
onChange={onChange}
selected={value}
placeholderText="Enter your birth date"
/>
);
}}
/>
如果您使用 RHF,您也不需要useState
处理您的状态更改,因为 RHF 将为您处理这些更改。
更新
要显示错误,您需要errors
RHF 通过formState
属性提供的对象。但是您需要先创建一个验证规则:您可以在 RHF 提供的规则和自定义规则之间进行选择,请参阅此处了解更多信息(请不要混淆,您可以在 文档下找到规则register
,因为register
和<Controller />
具有相同验证规则的接口)。
然后,您可以使用rules
来自 的道具添加规则<Controller />
。例如,我添加了一个验证来检查所选日期是否超过 2 年。为了显示错误,我使用了<ErrorMessage />
包提供的组件@hookform/error-message
,但您也可以检查是否errors.birthDate
存在并显示您自己的自定义错误消息。
const sub2Years = subYears(2);
const isOlderThan2Years = (date) =>
isBefore(sub2Years(new Date()), date) || "Date is not older than 2 years";
<Controller
name={"birthDate"}
control={control}
defaultValue={new Date()}
rules={{ validate: { isOlderThan2Years } }}
render={({ field: { onChange, value } }) => {
return (
<DatePicker
onChange={onChange}
selected={value}
placeholderText="Enter your birth date"
/>
);
}}
/>
<ErrorMessage
errors={errors}
name="birthDate"
render={({ message }) => <p>{message}</p>}
/>
推荐阅读
- javascript - 如何从两个组件视图都在不同页面(选项卡)中的不同组件刷新组件?
- html - 提取/突出显示 div 标签内的所有内容,包括带有正则表达式的 div 标签本身
- c++ - 这两个声明之间最好的操作符 == 函数是哪个?
- python - 显然,我的 if 语句中的“:”是无效语法
- keyboard - 有没有办法在处理过程中一次检测多个键输入?
- java - 使用 Chudnovsky 算法计算 pi 的错误结果
- angular - 将 Angular 应用程序和 ASPNET Core 发布到 IIS 后出现 CORS 策略错误
- sql - STUFF 只有唯一值以及对另一列进行排序
- javascript - 如何淡出导航栏的最右侧并向其添加新按钮
- reactjs - React JS DateTimePicker 问题 - 更改时间 12:01 pm 和 1:59 pm - 更新到下一个日期