<div id="app"/>
@import url('https://fonts.googleapis.com/css?family=Roboto+Mono:700&display=swap');
html {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
body {
font-size: 60px;
font-weight: 700;
font-family: 'Roboto Mono', monospace;
color: #5D9199;
background-color: #A3E3ED;
}
const Counter = () => {
const [count, setCount] = React.useState(0)
// Use useRef for mutable variables that we want to persist
// without triggering a re-render on their change
const requestRef = React.useRef();
const previousTimeRef = React.useRef();
const animate = time => {
if (previousTimeRef.current != undefined) {
const deltaTime = time - previousTimeRef.current;
// Pass on a function to the setter of the state
// to make sure we always have the latest state
setCount(prevCount => (prevCount + deltaTime * 0.01) % 100);
}
previousTimeRef.current = time;
requestRef.current = requestAnimationFrame(animate);
}
React.useEffect(() => {
requestRef.current = requestAnimationFrame(animate);
return () => cancelAnimationFrame(requestRef.current);
}, []); // Make sure the effect runs only once
return <div>{Math.round(count)}</div>
}
ReactDOM.render(<Counter />, document.getElementById('app'))
View Compiled
This Pen doesn't use any external CSS resources.