javascript - push() 删除以前的值
问题描述
我正在尝试将新值推送到数组中,但我得到的只是计算的最后一个值。我看过其他答案,但似乎无法弄清楚。感谢您的帮助,谢谢。
简介:单击开始时我设置了一个新日期,然后每次单击方形 div 时,都会计算前一个日期和当前日期之间的时间,差值 (diff) 是输出。我正在尝试使用 push() 将所有差异值保存到一个名为 diffArray 的数组中,但只有最后一个值被保存/输出。
function App() {
const [startTime, setStartTime] = useState();
const [diff, setDiff] = useState();
const [gate, setGate] = useState(false);
const [left, setLeft] = useState(Math.floor(Math.random() * 1000));
const [top, setTop] = useState(Math.floor(Math.random() * 1000));
let diffArray = [];
const divStyle = {
height: 20,
width: 20,
top: top,
left: left,
position: "absolute",
backgroundColor: "brown"
};
const handleClick = () => {
setDiff((Date.now() - startTime) + '/ms');
if (diff !== undefined) {
diffArray.push(diff);
}
setStartTime(Date.now());
respawn();
ArrayMsOutput(diffArray);
}
const startClick = () => {
setGate(!gate);
setStartTime(Date.now());
}
const respawn = (e) => {
setLeft(Math.floor(Math.random() * 1000));
setTop(Math.floor(Math.random() * 900));
}
const ArrayMsOutput = (e) => {
return e;
}
return (
<div className="App">
<button onClick={startClick}>{gate ? 'Stop' : 'Start'}</button>
<div>{gate && diff}</div>
<div>{ArrayMsOutput()}</div>
{gate && <div onClick={handleClick} style={divStyle}>
</div>}
</div>
);
}
export default App;
解决方案
const handleClick = () => {
setDiff((Date.now() - startTime) + '/ms');
if (diff !== undefined) {
diffArray.push(diff);
}
}
这不起作用,因为您的钩子将在函数结束后具有该值。你需要做:
const handleClick = () => {
const newDiff = (Date.now() - startTime) + '/ms';
setDiff(newDiff);
if (newDiff !== undefined) {
diffArray.push(newDiff);
}
}
然后,您的数组只有最新的值,因为您需要将其转换为 useState 挂钩: const [diffArray, setDiffArray] = useState([]) 。
完成后,将您的函数重构为:
const handleClick = () => {
const newDiff = (Date.now() - startTime) + '/ms';
setDiff(newDiff);
if (newDiff !== undefined) {
setDiffArray(oldArray => [...oldArray, newDiff])
}
}
推荐阅读
- c++ - 我正在尝试使用 -fsanitizer=address 进行编译,但不断收到“找不到 -lasan”
- java - Java 泛型参数是如何推断的?
- ios - UIImagePickerController 只能在主线程中使用 | 应用程序崩溃
- f# - 如何在 F# 中将 Excel 工作表放入 Deedle 数据框
- memory-management - Solaris 中的物理内存利用率
- python - 读取 5gb 以上的 csv 数据集
- gitlab - 阶段对于其他分支是可选的,但对于主分支是强制性的
- linux - __init 函数中的本地静态标识符会发生什么?
- repast-simphony - 批量运行后的模拟可视化
- d3.js - dc.js 中带有 JSON 对象的折线图