I’m trying to push new values to an array but all I’m getting is only the last value computed. I’ve looked at other answers but couldn’t seem to figure it out. I appreciate the help thanks.
brief: upon clicking start I set a new date, then upon each time I click on the square div, the time is calculated between the previous date and the current date and the difference (diff) is oputput. I am attempting to save all the diff values into an array called diffArray using push() but only the last value is being saved/ output.
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;
Advertisement
Answer
const handleClick = () => { setDiff((Date.now() - startTime) + '/ms'); if (diff !== undefined) { diffArray.push(diff); } }
This won’t work because your hook will have the value after the end of the function. You need to do:
const handleClick = () => { const newDiff = (Date.now() - startTime) + '/ms'; setDiff(newDiff); if (newDiff !== undefined) { diffArray.push(newDiff); } }
Then, your array has only the latest value because you need to convert it to a useState hook: const [diffArray, setDiffArray] = useState([]) .
When you’ve done it, refacto your function to:
const handleClick = () => { const newDiff = (Date.now() - startTime) + '/ms'; setDiff(newDiff); if (newDiff !== undefined) { setDiffArray(oldArray => [...oldArray, newDiff]) } }