useRaf.ts 871 B

12345678910111213141516171819202122232425262728293031323334353637
  1. import { ref, onUnmounted } from 'vue'
  2. import { isDef, isH5, isNumber } from '../common/util'
  3. // 定义回调函数类型
  4. type RafCallback = (time: number) => void
  5. export function useRaf(callback: RafCallback) {
  6. const requestRef = ref<number | null | ReturnType<typeof setTimeout>>(null)
  7. // 启动动画帧
  8. const start = () => {
  9. const handle = (time: number) => {
  10. callback(time)
  11. }
  12. if (isH5) {
  13. requestRef.value = requestAnimationFrame(handle)
  14. } else {
  15. requestRef.value = setTimeout(() => handle(Date.now()), 1000 / 30)
  16. }
  17. }
  18. // 取消动画帧
  19. const cancel = () => {
  20. if (isH5 && isNumber(requestRef.value)) {
  21. cancelAnimationFrame(requestRef.value!)
  22. } else if (isDef(requestRef.value)) {
  23. clearTimeout(requestRef.value)
  24. }
  25. }
  26. onUnmounted(() => {
  27. cancel()
  28. })
  29. return { start, cancel }
  30. }