~/swaraj.dev
Back to all posts
May 29, 20261 min read

Defer Heavy Work with InteractionManager for Smoother UI

Learn how to use React Native's InteractionManager to postpone expensive calculations until after animations, improving perceived performance.

react nativeperformanceinteractionmanager

Insight

When a screen mounts, React Native often runs layout, data fetching, and animation simultaneously. If you kick off a CPU‑intensive task right away, the UI thread competes for time and you’ll notice jank. InteractionManager lets you schedule work to run only after all ongoing interactions—such as navigation transitions or gestures—have finished, keeping the frame budget clean.

Example

import { InteractionManager } from 'react-native';
import { useEffect, useState } from 'react';

export default function HeavyScreen() {
  const [result, setResult] = useState<number | null>(null);

  useEffect(() => {
    const task = InteractionManager.runAfterInteractions(() => {
      // Simulate a heavy calculation
      let sum = 0;
      for (let i = 0; i < 1e7; i++) sum += i;
      setResult(sum);
    });
    return () => task.cancel();
  }, []);

  return result ? <Text>{result}</Text> : <ActivityIndicator />;
}

Takeaway

Wrap any non‑essential, CPU‑heavy logic in InteractionManager.runAfterInteractions to let animations finish first. Cancel the task on unmount to avoid memory leaks, and you’ll get noticeably smoother transitions without sacrificing functionality.