React Native Performance: Optimizing List Views and Reducing Re-renders
John Hambardzumian · Full Stack & Mobile Developer | Node.js, React Native, PHP, Laravel | 7+ Years Building Scalable Web & Mobile AppsMar 15, 20262 min readBuilding smooth, responsive React Native apps often comes down to how you handle lists and updates. This post walks through real-world optimizations that have worked for production apps at scale.
Why list performance matters
List views (FlatList, SectionList) are where users spend most of their time in feed-based or data-heavy apps. Dropped frames here are immediately visible and hurt perceived quality. The goal is to keep the UI thread busy with meaningful work and avoid unnecessary JavaScript execution and layout thrash.
1. Use the right list components
Always prefer FlatList or SectionList over mapping over an array and rendering hundreds of views. These components virtualize: only mounted items are in the tree, so memory and layout cost stay bounded.
// Prefer this
<FlatList
data={items}
renderItem={({ item }) => <ItemRow item={item} />}
keyExtractor={(item) => item.id}
getItemLayout={getItemLayout} // optional but helps scroll perf
/>2. Stabilize item identity and callbacks
If keyExtractor or renderItem change on every render, React (and the native list) may treat items as new and re-mount or re-measure. Use stable IDs and memoized callbacks.
- keyExtractor: return a unique, stable string (e.g.
item.id). - renderItem: wrap in
useCallbackor define outside the component if it doesn’t depend on state. - Item component: wrap in
React.memoso it only re-renders when its props change.
3. Reduce re-renders with memo and useMemo
Parent state updates cause children to re-render unless they’re memoized. For list items, pass only the data that item needs and memoize the row component.
Tip: Use React DevTools Profiler to see which components re-render and how often. Focus on list item components first.
4. Avoid inline objects and functions in list props
Passing style={{ marginTop: 10 }} or onPress={() => doSomething(item)} in renderItem creates new references every render. That can break React.memo and cause extra work. Define styles and handlers outside the render or with useCallback / useMemo.
5. Use getItemLayout when item height is fixed
If every row has the same height (or you can compute it), provide getItemLayout. That lets the list skip measuring and makes scrolling to an index instant.
Wrapping up
List performance in React Native is mostly about: virtualization, stable identities, fewer re-renders, and helping the list avoid unnecessary layout. Apply these patterns early so they become default; retrofitting later is harder. For more, check the official FlatList optimization guide and profile with Flipper or the built-in profiler.

Written by John Hambardzumian
Full Stack & Mobile Developer | Node.js, React Native, PHP, Laravel | 7+ Years Building Scalable Web & Mobile Apps. Focused on React Native and full-stack development.