Привет ребята ? Итак, я сейчас разрабатываю веб с помощью React, и мне нужно сделать секундомер, который будет воспроизводиться, когда я нажимаю кнопку, поэтому я использую метод setInterval(). Но когда я нажимаю кнопку и выполняется setInterval(), я получаю это предупреждение от библиотеки почему-вы-обновили, что означает избегать повторного рендеринга. Я уже использую PureComponent, но почему, когда setInterval() работает, какой-то компонент все еще перерисовывается? это заставляет парней отставать, и если я остановлю setInterval с помощью метода clearInterval(), компонент прекратит повторный рендеринг.
Код примерно такой:
startTimer() {
// Test
this.setState(
prevState => ({
...prevState,
isSessionStarted: true,
duration: prevState.duration,
startedAt: Date.now() - prevState.duration
}),
() => {
this.timer = setInterval(
() =>
this.setState(prevState => ({
duration: Date.now() - prevState.startedAt
})),
1000
);
}
);
}
stopTimer() {
this.setState({ isSessionFinished: true }, () => {
clearInterval(this.timer);
});
}
Любое решение? Спасибо раньше.
Вы также можете поделиться своей функцией рендеринга?
@apokryfos gist.github.com/dafapramudya/6ed368a5cb9d5c3f71012c0bbb862a23
Предполагая, что _getDuration вернет то, что находится в state.duration, затем повторный рендеринг на каждом тике является необходимым
@apokryfos хм, но он все еще перерисовывается, хотя я удаляю метод _getDuration
Он будет перерисовываться каждый раз, когда вы вызываете setState, как упоминал @nubinub. Однако я говорю, что то, как вы построили свой компонент, кажется вашим намерением.
если вы не хотите повторно отображать, я думаю, вы можете объявить продолжительность как часть вашего компонента. Вам нужно преобразовать ваш компонент в класс.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


От реактивная документация:
setState() will always lead to a re-render unless shouldComponentUpdate() returns false. If mutable objects are being used and conditional rendering logic cannot be implemented in shouldComponentUpdate(), calling setState() only when the new state differs from the previous state will avoid unnecessary re-renders.