~/swaraj.dev
Back to all posts
March 28, 20261 min read

Deferring Heavy Work with InteractionManager in React Native

Learn how to use InteractionManager to push expensive calculations off the UI thread, keeping animations smooth and responsive.

react nativeperformanceinteractionmanager

Insight

When a screen transition or animation is in progress, any synchronous JavaScript work can cause jank. React Native's InteractionManager lets you schedule heavy tasks after all ongoing interactions have finished, ensuring the UI thread stays free for rendering. This pattern is especially useful for data parsing, image processing, or initializing large libraries right after navigation.

Example

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

export default function DetailScreen() {
  const [items, setItems] = useState<string[]>([]);

  useEffect(() => {
    const task = InteractionManager.runAfterInteractions(() => {
      // Simulate heavy work
      const data = Array.from({ length: 5000 }, (_, i) => `Item ${i}`);
      setItems(data);
    });
    return () => task.cancel();
  }, []);

  return <FlatList data={items} renderItem={({ item }) => <Text>{item}</Text>} />;
}

Takeaway

Wrap any non‑essential, CPU‑intensive logic in InteractionManager.runAfterInteractions to keep animations buttery smooth. Remember to cancel the task on unmount to avoid memory leaks.