При обновлении состояния в React, изменения не всегда отображаются мгновенно, а зависят от реализации механизма обновления. Ваш случай может быть связан с тем, что React может объединять несколько обновлений состояния в одно, если они происходят в рамках одной функции-обработчика, как в вашем примере.
Поэтому, когда вы вызываете console.log(data[0].start) сразу после обновления состояния, вы можете видеть как "старое" значение, а не обновленное. Но, если вы вызовете console.log(data[0].start) внутри useEffect с зависимостью [data], то это должно отобразить обновленное значение.
Если вы хотите выполнить какие-то действия после изменения состояния, то лучше всего использовать useEffect с зависимостью от состояния. В вашем случае, измените обработчик следующим образом:
const changeDT: ChangeDateTime = (type, value, index) => {
setData((prev) => {
const newData = [...prev];
newData[index][type] = value;
return newData;
});
}
useEffect(() => {
console.log(data[0].start);
}, [data]);
В этом примере мы клонируем массив данных, изменяем нужное значение и возвращаем обновленный массив. Затем, используем useEffect для выполнения дополнительных действий после обновления состояния.