Причина, по которой вы видите странное поведение, заключается в том, что ваш handleDateClick
вызывает setFormData
два раза подряд, что является проблемой, поскольку setFormData
это асинхронно, то есть оно не будет немедленно отражать и обновлять ваше состояние.
См. этот вопрос SO для получения более подробной информации:
Итак, По сути, в конечном итоге вы обновляете dateFrom
, а затем сразу после этого вызываете setFormData
, и поскольку он использует старое состояние , вы никогда не увидите обновленное значение для dateFrom
.
const handleDateClick = interval => {
setFormData({ ...formData, dateFrom: ... })
// uses the value of `dateFrom` from the "old state"
// when you do `...formData`, then updates `dateTo`
setFormData({ ...formData, dateTo: ... })
}
Я предлагаю вам объединить все ваши обновления внутри handleDateClick
в один setFormData
звонок. Судя по тому, как это выглядит, у вас нет причин делать два отдельных вызова.
Вот как вам следует подходить к этому:
function Button({ children, ...rest }) {
return <button {...rest}>{children}</button>;
}
function MyComp() {
const [formData, setFormData] = React.useState({
dateFrom: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
dateTo: new Date()
});
const handleDateClick = interval => {
setFormData({
dateTo: new Date(),
dateFrom: new Date(Date.now() - interval * 24 * 60 * 60 * 1000)
});
};
return (
<>
<Button onClick={() => handleDateClick(30)}>Click me!</Button>
<p>
<b>State:</b> {JSON.stringify(formData)}
</p>
</>
);
}
Вот рабочий пример, если вы хотите см .: