#reactjs #datepicker #next.js #react-datepicker #react-hook-form
#reactjs #datepicker #next.js #react-datepicker #react-hook-form
Вопрос:
Я создаю форму в next.js где я бы сохранял дату вместе с другими полями.
Я использую react-form-hooks и react-datepicker
Проблема: когда я нажимаю отправить, я вижу ввод даты в консоли.регистрируйте, но не можете увидеть выбранную дату при вводе даты. пожалуйста, обратитесь к скриншоту для получения подробного снимка экрана
Я следую примеру, приведенному в https://codesandbox.io/s/react-hook-form-controller-079xx где они также используют react-datepicker с помощью react-hooks-forms
желаемый результат: когда я выбираю дату, дата должна отображаться в поле ввода даты, например: 08.09.2020
ниже приведен код, который я написал. пожалуйста, помогите, спасибо
import Head from "next/head";
import DatePicker from "react-datepicker";
import { useForm, Controller } from "react-hook-form";
const Form = () =&&t; {
const { re&ister, handleSubmit, control } = useForm();
const onSubmit = (data) =&&t; console.lo&(data);
const [selectedDate, setselectedDate] = useState(null);
return (
<&&t;
<Head&&t;
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/react-datepicker/2.14.1/react-datepicker.min.css"
/&&t;
</Head&&t;
<form onSubmit={handleSubmit(onSubmit)}&&t;
<section&&t;
<label&&t;Created Date</label&&t;
<Controller
as={DatePicker}
control={control}
valueName="selected"
selected={selectedDate}
onChan&e={(date) =&&t; setselectedDate(date)}
dateFormat="dd/MM/yyyy"
placeholderText="Select Date"
name="DatePicker"
defaultValue={null}
/&&t;
{/* <DatePicker
selected={selectedDate}
onChan&e={(date) =&&t; setselectedDate(date)}
dateFormat="dd/MM/yyyy"
placeholderText="Select Date"
/&&t; */}
</section&&t;
<input type="submit" /&&t;
</form&&t;
</&&t;
);
};
export default Form;
Ответ №1:
Чао, твоя проблема в onChan&e
prop. Если valueName
реквизит установлен как selected
, onChan&e
функция должна возвращать selected
следующее:
onChan&e={([selected]) =&&t; {
setselectedDate(selected);
return selected;
}}
Таким образом, ваш DatePicker
становится:
<Controller
as={DatePicker}
control={control}
valueName="selected"
selected={selectedDate}
onChan&e={([selected]) =&&t; {
setselectedDate(selected);
return selected;
}}
dateFormat="dd/MM/yyyy"
placeholderText="Select Date"
name="DatePicker"
defaultValue={null}
/&&t;
Не только, но, несмотря на то, что вы уже установили DateFormat в DatePicker
элементе, для получения данных в определенном формате вам необходимо переформатировать данные, полученные из form
. Поскольку react-hooks-forms DatePicker
использует moment
для даты, я использовал moment
для форматирования даты вывода.
Таким образом, onSubmit
функция становится:
import moment from "moment";
...
const onSubmit = (data) =&&t; {
console.lo&(moment(selectedDate).format("DD/MM/yyyy"));
};
Здесь изменен codesandbox, который показывает, что я сделал.
Комментарии:
1. У меня это все еще не работает, я буквально скопировал ваше решение, но оно по-прежнему не отображает выбранную дату в моем поле ввода даты. Но я хотел бы сказать, что моя проблема заключалась не в выводе в консоль. регистрируйте, но факт, что выбранная дата не отображается в поле ввода даты. например, когда вы выбираете любую дату с помощью средства выбора даты, выбранная дата должна появиться в поле ввода даты, в моем случае этого не происходит, заполнитель остается и не исчезает, и когда я нажал отправить, дата выводится.
2. Чао, я нашел вашу проблему. Я изменил свой ответ и пример codesandbox.
3. Эй, все еще не работает, я создал codesandbox и вставил предоставленный вами код, дело в том, что я проверил ссылку, которую вы предоставили, она отлично работает там, но не работает в моем коде, codesandbox.io/s/react-hook-form-err-date-picker-rhci&?file =/… вот ссылка на мой codesandbox, пожалуйста, взгляните на код.
4. О, я нашел, почему ваш пример не работает. Мы используем другую версию react-hook-form! В вашем codesandbox вы используете версию 6.3.1. В моем codesandbox я использую версию 5.5.1. Я просто изменил версию в вашем примере, и все это сработало. Проверьте здесь
5. Спасибо, чувак, это сработало! не могу поверить, что это была проблема с версией. Знаете ли вы о какой-либо причине, по которой это работает не в последней версии, а в более старых версиях?