Course contentsShow
← React Native
Lesson 286 of 1,5554. Flexbox and Native StylingFree lesson

Optimizing Re-renders with Style Memoization

Use memoization strategies to prevent unnecessary style recalculations in large lists.

In this lesson, you will learn how to prevent unnecessary style recalculations in large React Native lists by memoizing style objects to ensure stable memory references.

The Problem: The "New Object" Trap

When you build a long FlatList, React re-renders items whenever their props or parent state change. A common pitfall occurs when we define styles directly inside the component body:

const ListItem = ({ item }) => {
  // Every time ListItem renders, this object is recreated in memory!
  const containerStyle = { padding: 10, backgroundColor: item.active ? 'blue' : 'white' };
  
  return <View style={containerStyle} />;
};

Even if the containerStyle properties are identical to the previous render, JavaScript treats this as a brand-new object. Because React Native’s StyleSheet system often performs a shallow comparison to determine if a view needs to update, these "fresh" objects can force the bridge to re-process styles unnecessarily. In a list with hundreds of items, this creates micro-stutters.

The Solution: Memoization

To fix this, we ensure that the style object reference stays identical across renders unless the data actually changes. We achieve this using the useMemo hook.

import React, { useMemo } from 'react';
import { View, StyleSheet } from 'react-native';

const ListItem = ({ item }) => {
  // The style is only recalculated if 'item.active' changes
  const containerStyle = useMemo(() => ({
    padding: 10,
    backgroundColor: item.active ? 'blue' : 'white',
  }), [item.active]);

  return <View style={containerStyle} />;
};

By wrapping the style object in useMemo, you cache the object reference. React Native now receives the exact same reference as the previous render, allowing the engine to skip style re-calculation entirely.

Best Practice Tip

While useMemo is great for dynamic styles based on props, always prefer defining static, shared styles using StyleSheet.create() outside your component function. Only reach for useMemo when your styles are truly dynamic and depend on specific component data. This keeps your memory footprint low and your lists scrolling at a buttery-smooth 60fps.

Key Takeaway: Use useMemo to cache dynamic style objects so that your component passes the same memory reference to the view engine, preventing redundant re-renders in heavy list scenarios.