Есть несколько вещей, которые вы должны выяснить / принять во внимание при преобразовании компонента на основе классов в функциональный компонент.
Не инициализируйте ваше состояние с помощью new Date()
,
const [days, setDays] = useState({
from: new Date(),
to: new Date(today.getTime() + 24 * 60 * 60 * 1000)
});
Формат даты new Date()
и формат даты вашего DayPickerInput
не совпадают.Поэтому вам нужно сохранить его как undefined
/ преобразовать new Date()
в формат, понятный вашему DayPickerInput
.
const [days, setDays] = useState({
from: undefined,
to: undefined
});
Другое дело, что setState
в компонентах на основе классов и функциональных компонентах работают немного по-разному.setState
в функциональном компоненте не имеет обратного вызова.
Это setState
немного неверно,
const handleFromChange = from => {
// Change the from date and focus the "to" input field
setDays({ from, to }, showFromMonth);
};
const handleToChange = to => {
setDays({ from, to });
};
Здесь showFromMonth
, поскольку обратный вызов не будет работать.Вам нужен отдельный useEffect
хук, который будет прослушивать изменение состояния и запускать побочный эффект / обратный вызов соответственно,
const handleFromChange = from => {
// Change the from date and focus the "to" input field
//This is functional setState which will only update `from` value
setDays(days => ({
...days,
from
}));
};
const handleToChange = to => {
//This is functional setState which will only update `to` value
setDays(days => ({
...days,
to
}));
};
//This is useEffect hook which will run only when `to` value changes
useEffect(()=>{
showFromMonth();
},[days.to, showFromMonth])
Вы предоставили ref
вашему второму сборщику дат,
ref={el => {
days.to = el;
}}
Вы должны создать переменную ref
отдельно и не использовать напрямую состояние как ref
.
let toInput = React.createRef();
ref={el => {
toInput = el;
}}
Я сделал некоторые изменения в вашем коде в соответствии с Фактический код , который вы указали в вопросе.
Демо