requestAnimationFrame
Window.requestAnimationFrame() - Web API | MDN
requestAnimationFrame(callback)
window.cancelAnimationFrame() - Web API | MDN
React
2019-08-23 Using requestAnimationFrame with React Hooks | CSS-Tricks
如果想搭配useEffect使用,需傳入空陣列避免重複執行
即只呼叫一次
以及使用useRef儲存時戳和請求ID
code:javascript
const requestRef = React.useRef()
const previousTimeRef = React.useRef()
const animate = time => {
if (previousTimeRef.current != undefined {
const delta = time - previousTimeRef.current
// do something to the state you want to change
}
previousTimeRef.current = time
requestRef.current = requestAnimationFrame(animate)
}
React.useEffect(() => {
requestRef.current = requestAnimationFrame(animate)
return () => cancelAnimationFrame(requestRef.current)
}, [])
也可整個包裝成單一Hooks
code:javascript
const useAnimationFrame = callback => {
const requestRef = React.useRef()
const previousTimeRef = React.useRef()
const animate = time => {
if (previousTimeRef.current != undefined) {
const deltaTime = time - previousTimeRef.current
callback(deltaTime)
}
previousTimeRef.current = time
requestRef.current = requestAnimationFrame(animate)
}
React.useEffect(() => {
requestRef.current = requestAnimationFrame(animate)
return () => cancelAnimationFrame(requestRef.current)
}, [])
}
const Counter = () => {
const count, setCount = React.useState(0)
useAnimationFrame(deltaTime => {
setCount(prevCount => (prevCount + deltaTime * 0.01) % 100)
})
return <div>{Math.round(count)}</div>
}
ReactDOM.render(<Counter />, document.getElementById('app'))
2020-10-27 ReactでrequestAnimationFrameを使う - 雑記 | Webとか絵とか日常など
useCallback
2022-04-18 requestAnimationFrame の使い方(アニメーション)
https://github.com/franciscop/use-animation-frame
https://github.com/phantomstudios/use-animation-frame
RequestAnimationFrame and UseEffect vs UseLayoutEffect | Jakub Arnold's Blog
What are Long Animation Frames (LoAF)? - Request Metrics 🦥
Fixing Long Animation Frames (LoAF) - Request Metrics 🦥