【发布时间】:2021-10-04 21:35:44
【问题描述】:
我正在尝试创建一个带有“浴缸”和 2 个按钮的应用程序。浴缸有 5 个水位。 当您单击第一个按钮时,浴缸每 2 秒填充一个级别,直到达到 5。另一个按钮将浴缸排干直到级别 0。increaseWaterLevel 和 reductionWaterLevel 函数只触发一次,我不知道为什么。
import React, { useState } from "react";
const App = () => {
const [waterLevel, setWaterLevel] = useState(0);
let fillTub;
let drainTub;
const increaseWaterLevel = () => {
if (waterLevel < 5) {
const newWaterLevel = waterLevel + 1;
setWaterLevel(newWaterLevel);
} else {
clearInterval(fillTub);
}
};
const decreaseWaterLevel = () => {
if (waterLevel > 0) {
const newWaterLevel = waterLevel - 1;
setWaterLevel(newWaterLevel);
} else {
clearInterval(fillTub);
}
};
return (
<div>
<div>Bathtub</div>
<button
onClick={() => {
fillTub = window.setInterval(increaseWaterLevel, 2000);
}}
>
increaseWaterLevel
</button>
<button
onClick={() => {
drainTub = window.setInterval(decreaseWaterLevel, 2000);
}}
>
decreaseWaterLevel
</button>
</div>
);
};
export default App;
更新计数器正在工作但没有停止并且水位保持在 0。我做错了什么?
import React, { useState } from "react";
const App = () => {
const [waterLevel, setWaterLevel] = useState(0);
const [intervalId, setIntervalId] = useState(0);
const increaseWaterLevel = () => {
const newWaterLevel = setInterval(() => {
if (waterLevel > 4) {
clearInterval(intervalId);
} else {
setWaterLevel((prevWaterLevel) => prevWaterLevel + 1);
}
}, 2000);
setIntervalId(newWaterLevel);
};
const decreaseWaterLevel = () => {
const newWaterLevel = setInterval(() => {
if (waterLevel > 0) {
setWaterLevel((prevWaterLevel) => prevWaterLevel - 1);
} else {
clearInterval(intervalId);
}
}, 2000);
setIntervalId(newWaterLevel);
};
return (
<div>
<div>Bathtub</div>
<button onClick={increaseWaterLevel}>increaseWaterLevel</button>
<button onClick={decreaseWaterLevel}>decreaseWaterLevel</button>
</div>
);
};
export default App;
【问题讨论】:
-
看这里,了解如何使用 setInterval 和 clearInterval sebhastian.com/setinterval-react
-
这是一个很好的教程!但我还是有点困惑。我的 setInterval 没有跟踪状态变化,所以它是无限计数的。
-
@Gareth 检查我的答案,然后进行一些研究,例如“如何在 setState 之后获取更新的变量”。这对我帮助很大!
标签: javascript reactjs setinterval use-state