在這里,我在 React 中有一個簡單的計時器應用程式。在cancelAnimationFrame呼叫方法中的下一個之前,我是否需要始終呼叫?requestAnimationFrameanimate
我從某處讀到,如果我requestAnimationFrame在單個回呼中呼叫多個,那么cancelAnimationFrame是必需的。但在我的示例中,我requestAnimationFrame在單個回呼中呼叫 single。
當有人在這篇文章中說不需要而另一個人說需要時,我什至感到困惑:https ://medium.com/@moonformeli/hi-caprice-liu-8803cd542aaa
function App() {
const [timer, setTimer] = React.useState(0);
const [isActive, setIsActive] = React.useState(false);
const [isPaused, setIsPaused] = React.useState(false);
const increment = React.useRef(null);
const start = React.useRef(null);
const handleStart = () => {
setIsActive(true);
setIsPaused(true);
setTimer(timer);
start.current = Date.now() - timer;
increment.current = requestAnimationFrame(animate);
};
const animate = () => {
setTimer(Date.now() - start.current);
cancelAnimationFrame(increment.current);
increment.current = requestAnimationFrame(animate);
};
const handlePause = () => {
cancelAnimationFrame(increment.current);
start.current = 0;
setIsPaused(false);
};
const handleResume = () => {
setIsPaused(true);
start.current = Date.now() - timer;
increment.current = requestAnimationFrame(animate);
};
const handleReset = () => {
cancelAnimationFrame(increment.current);
setIsActive(false);
setIsPaused(false);
setTimer(0);
start.current = 0;
};
return (
<div className="app">
<div className="stopwatch-card">
<p>{timer}</p>
<div className="buttons">
{!isActive && !isPaused ? (
<button onClick={handleStart}>Start</button>
) : isPaused ? (
<button onClick={handlePause}>Pause</button>
) : (
<button onClick={handleResume}>Resume</button>
)}
<button onClick={handleReset} disabled={!isActive}>
Reset
</button>
</div>
</div>
</div>
);
};
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>
uj5u.com熱心網友回復:
不,您不需要在遞回函式中取消 raf,因為 raf 就像 setTimeout 一樣,但它與螢屏重繪 率完美同步地執行該函式,因此它只執行一次:
const animate = ()=>{
setTimer(Date.now()-start.current)
increment.current = requestAnimationFrame(animate)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467760.html
標籤:javascript 反应 动画片 请求动画帧 取消动画帧
