react: почему не изменяются состояния компонента
Есть компонент со таймером обратного отсчёта от Ant Design (Statistic.Countdown
).
Хотя, чтоб в зависимости от того сколько времени осталось до 0 он отрисовывался в разных стилях.
Делаю следующий код:
import { useState } from 'react';
import { Statistic } from 'antd';
const Header = (props) => {
// контроль состояний
const [timerState, setTimerState] = useState(0);
// стили для разных состояний
const styles = [
{deadline: 10, style: {color: '#000000', textAlign: 'center'}},
{deadline: 5, style: {color: '#bb0000', textAlign: 'center'}},
{deadline: 0, style: {color: '#bb0000', textAlign: 'center', animation: 'neon 1s infinite'}}
]
// колбэк: изменение времени таймера
const handleChangeTimer = (timer) => {
if (timer <= 1000 * styles[timerState]?.deadline) {
setTimerState(timerState + 1);
}
}
// отрисовать компонент
const currentStyle = styles[states.timer_state < styles.length ? states.timer_state : styles.length - 1].style;
return (
<Statistic.Countdown title='Время выполнения' value={props.timer} format='mm:ss' valueStyle={currentStyle} onChange={handleChangeTimer} />
);
}
В результате handleChangeTimer
регулярно вызывается, timer
уменьшается, setTimerState
вызывается, а вот timerState
никак не меняется и остается на одном значении (0).
В чем может быть дело?
Кстати если при этом как-то тормошить Statistic.Countdown
, например там же устанавливать через новое состояние ему value
, то setTimerState
начинает работать. Например:
// контроль состояний
const [timerState, setTimerState] = useState({
state: 0,
deadline: props.timer
});
// колбэк: изменение времени таймера
const handleChangeTimer = (timer) => {
if (timer <= 1000 * styles[timerState]?.deadline) {
setTimerState({
timerState.state: timerState + 1,
deadline: Date.now() + timer);
}
}
return (
<Statistic.Countdown title='Время выполнения' value={timerState.deadline} format='mm:ss' valueStyle={currentStyle} onChange={handleChangeTimer} />
);
Почему так?
Источник: Stack Overflow на русском