【发布时间】:2019-10-07 20:18:41
【问题描述】:
我正在尝试对我正在处理的项目中的倒计时组件进行重构。
当我完成逻辑迁移时,计数器的值不起作用。我决定在 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。
代码沙盒: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);
【问题讨论】:
标签: reactjs react-hooks