使用 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;

您可以提供 defaultValuesuseForm 挂钩以设置 默认值 值:

完整的示例,请参阅评论

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
    });
  });
}, []);