useRafFn

Call function on every requestAnimationFrame. With controls of pausing and resuming.

Usage

const Demo = () => {
  const [ticks, setTicks] = useState(0);
  const [lastCall, setLastCall] = useState(0);
  const update = useUpdate();

  const [loopStop, loopStart, isActive] = useRafFn((time) => {
    setTicks(ticks => ticks + 1);
    setLastCall(time);
  });

  return (
    <div>
      <div>RAF triggered: {ticks} (times)</div>
      <div>Last high res timestamp: {lastCall}</div>
      <br />
      <button
        onClick={() => {
          isActive() ? loopStop() : loopStart();
          update();
        }}
      >
        {isActive() ? "STOP" : "START"}
      </button>
    </div>
  );
};

Example

RAF triggered: 0 (times)
Last high res timestamp: 0

Type Declarations

export type RafLoopReturns = readonly [() => void, () => void, () => boolean]
export default function useRafFn(
  callback: FrameRequestCallback,
  initiallyActive?: boolean
): RafLoopReturns