Я пытаюсь выполнить рефакторинг компонента обратного отсчета, который есть в проекте, над которым я работаю.
Когда я закончил миграцию логики, значение счетчика не сработало. Я решил начать с нуля в codesandbox, поэтому я подумал о простейшей реализации и получил следующее:
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
const [counter, setCounter] = useState(60);
useEffect(() => {
const interval = setInterval(() => setCounter(counter - 1), 1000);
return () => clearInterval(interval);
}, []);
return (
<div className="App">
<h1>Hello CodeSandbox {counter}</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App timerSeconds={360} />, rootElement);
В данном случае получается, что значение counter
остается на 59 после первого запускаинтервала.
Codesandbox: https://codesandbox.io/embed/flamboyant-moon-ogyqr
Вторая итерация в выпуске
Спасибо за ответ, Росс, но реальная проблема возникает, когда я связываю отсчет времени собработчик:
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
const [counter, setCounter] = useState(60);
const [countdownInterval, setCountdownInterval] = useState(null);
const startCountdown = () => {
setCountdownInterval(setInterval(() => setCounter(counter - 1), 1000));
};
useEffect(() => {
return () => clearInterval(countdownInterval);
});
return (
<div className="App" onClick={startCountdown}>
<h1>Hello CodeSandbox {counter}</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App timerSeconds={360} />, rootElement);