Причина, по которой ваш счетчик перезапускается, состоит в том, что при изменении поля ввода вы обновляете свое состояние. Обновление состояния вызовет повторное рендеринг, который в конечном итоге снова выполняет функцию Date.now ().
Решением вашей проблемы было бы перенести дату вашего обратного отсчета в ваш конструктор, чтобы она была установлена только один раз, а затем в вашей функции рендеринга ссылаться на нее через состояние.
constructor(props) {
super(props);
this.state = {
code: '',
disabled: false,
date: Date.now() + 120000
};
this.update = this.update.bind(this);
}
...
render() {
return (
<div>
<Input
className="text-center activationCode__letter-spacing"
maxLength="4"
type="text"
pattern="\d*"
id="activationCode__input-fourth"
bsSize="lg"
value={this.state.code}
onChange={this.update}
/>{' '}
<Countdown date={this.state.date} renderer={renderer} />
</div>
);
}