使用 React-Hook-Form V7 在 DatePicker Antd 中设置默认值
Set default value in DatePicker Antd with React-Hook-Form V7
我试图在从服务器获取数据时为Datepicker
设置默认值,但没有成功。按照文档 in here,我无法设置 defaultValue
道具,因为它仅用于首次渲染。
我发现一个解决方案是创建状态并在 Datepicker
更改时更新该状态。但这似乎很愚蠢,因为它会重新渲染每个更新。请让我知道“更好的解决方案”或使用 react-hook-form 值的“状态”。这是我当前的“愚蠢解决方案”:
import { DatePicker, Form } from "antd";
import moment, { Moment } from "moment";
import { useEffect, useState } from "react";
import {
Controller,
ControllerRenderProps,
SubmitHandler,
useForm,
} from "react-hook-form";
const UserList = () => {
const [date, setDate] = useState<Moment | null>();
const dateFormat = "YYYY-MM-DD";
useEffect(() => {
setDate(() => moment("1963-10-14T00:00:00"));
}, []);
const onChange = (date: Moment | null, dateString: string) => {
console.log(date, dateString);
};
interface IForm {
dob: string;
}
const {
handleSubmit,
formState: { errors },
control,
reset,
getValues,
watch,
} = useForm<IForm>({
// resolver: yupResolver(UserInfoSchema),
});
const dateWatch = watch("dob");
const handleSubmitForm: SubmitHandler<IForm> = (data: IForm) => {
console.log(data);
};
const onDatePickerChange = (
date: moment.Moment | null,
dateString: string,
props: any
) => {
console.log(dateWatch);
setDate(date);
props.field.onChange(dateString);
};
return (
<>
<Form onFinish={handleSubmit(handleSubmitForm)}>
<Form.Item label={"label"}>
<Controller
control={control}
name={"dob"}
render={(props) => (
<DatePicker
onChange={(date, dateString) =>
onDatePickerChange(date, dateString, props)
}
value={date}
/>
)}
/>
</Form.Item>
</Form>
</>
);
};
export default UserList;
您可以提供 defaultValues
到 useForm 挂钩以设置 默认值 值:
完整的示例,请参阅评论:
import { DatePicker, Form } from "antd";
import moment from "moment";
import { Controller, SubmitHandler, useForm } from "react-hook-form";
// We usually define interface/type outside component
interface IForm {
dob: string;
}
const UserList = () => {
const { handleSubmit, control } = useForm<IForm>({
defaultValues: {
dob: "2021-01-01", // Default value here
},
});
const handleSubmitForm: SubmitHandler<IForm> = (data: IForm) => {};
return (
<Form onFinish={handleSubmit(handleSubmitForm)}>
<Form.Item label="Date of Birth">
<Controller
control={control}
name="dob"
render={(props) => (
<DatePicker
value={moment(props.field.value)} // DatePicker accepts a moment object
onChange={(_, dateString) => {
props.field.onChange(dateString); // No need of a state
}}
/>
)}
/>
</Form.Item>
</Form>
);
};
编辑:
如果需要在初始渲染后设置值,请使用reset,示例:
useEffect(() => {
fetchMyData().then(() => {
reset({
dob: "2005-05-05", // Set another date
});
});
}, []);
我试图在从服务器获取数据时为Datepicker
设置默认值,但没有成功。按照文档 in here,我无法设置 defaultValue
道具,因为它仅用于首次渲染。
我发现一个解决方案是创建状态并在 Datepicker
更改时更新该状态。但这似乎很愚蠢,因为它会重新渲染每个更新。请让我知道“更好的解决方案”或使用 react-hook-form 值的“状态”。这是我当前的“愚蠢解决方案”:
import { DatePicker, Form } from "antd";
import moment, { Moment } from "moment";
import { useEffect, useState } from "react";
import {
Controller,
ControllerRenderProps,
SubmitHandler,
useForm,
} from "react-hook-form";
const UserList = () => {
const [date, setDate] = useState<Moment | null>();
const dateFormat = "YYYY-MM-DD";
useEffect(() => {
setDate(() => moment("1963-10-14T00:00:00"));
}, []);
const onChange = (date: Moment | null, dateString: string) => {
console.log(date, dateString);
};
interface IForm {
dob: string;
}
const {
handleSubmit,
formState: { errors },
control,
reset,
getValues,
watch,
} = useForm<IForm>({
// resolver: yupResolver(UserInfoSchema),
});
const dateWatch = watch("dob");
const handleSubmitForm: SubmitHandler<IForm> = (data: IForm) => {
console.log(data);
};
const onDatePickerChange = (
date: moment.Moment | null,
dateString: string,
props: any
) => {
console.log(dateWatch);
setDate(date);
props.field.onChange(dateString);
};
return (
<>
<Form onFinish={handleSubmit(handleSubmitForm)}>
<Form.Item label={"label"}>
<Controller
control={control}
name={"dob"}
render={(props) => (
<DatePicker
onChange={(date, dateString) =>
onDatePickerChange(date, dateString, props)
}
value={date}
/>
)}
/>
</Form.Item>
</Form>
</>
);
};
export default UserList;
您可以提供 defaultValues
到 useForm 挂钩以设置 默认值 值:
完整的示例,请参阅评论:
import { DatePicker, Form } from "antd";
import moment from "moment";
import { Controller, SubmitHandler, useForm } from "react-hook-form";
// We usually define interface/type outside component
interface IForm {
dob: string;
}
const UserList = () => {
const { handleSubmit, control } = useForm<IForm>({
defaultValues: {
dob: "2021-01-01", // Default value here
},
});
const handleSubmitForm: SubmitHandler<IForm> = (data: IForm) => {};
return (
<Form onFinish={handleSubmit(handleSubmitForm)}>
<Form.Item label="Date of Birth">
<Controller
control={control}
name="dob"
render={(props) => (
<DatePicker
value={moment(props.field.value)} // DatePicker accepts a moment object
onChange={(_, dateString) => {
props.field.onChange(dateString); // No need of a state
}}
/>
)}
/>
</Form.Item>
</Form>
);
};
编辑:
如果需要在初始渲染后设置值,请使用reset,示例:
useEffect(() => {
fetchMyData().then(() => {
reset({
dob: "2005-05-05", // Set another date
});
});
}, []);