React Native Cheatsheet
Layout and Flexbox
Use this React Native reference while you build software engineering projects, review code, or refresh the syntax you reach for most.
Flexbox Basics
React Native uses Flexbox for all layout. Key differences from CSS:
- Default flexDirection is 'column' (not 'row')
- Default alignContent is 'flex-start' (not 'stretch')
- flex only accepts a single number (not the CSS shorthand)
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
<View style={{ flex: 1 }} /> {/* takes 1/3 of space */}
<View style={{ flex: 2 }} /> {/* takes 2/3 of space */}
</View>flexDirection
| Value | Main axis | Cross axis |
|---|---|---|
'column' (default) | top → bottom | left → right |
'column-reverse' | bottom → top | left → right |
'row' | left → right | top → bottom |
'row-reverse' | right → left | top → bottom |
<View style={{ flexDirection: 'row' }}>
<Text>Left</Text>
<Text>Right</Text>
</View>justifyContent (main axis)
| Value | Behavior |
|---|---|
'flex-start' (default) | Pack to start |
'flex-end' | Pack to end |
'center' | Center |
'space-between' | Equal gaps between |
'space-around' | Equal gaps around |
'space-evenly' | Equal gaps including edges |
alignItems (cross axis, per row)
| Value | Behavior |
|---|---|
'stretch' (default) | Fill cross axis |
'flex-start' | Pack to cross-start |
'flex-end' | Pack to cross-end |
'center' | Center on cross axis |
'baseline' | Align text baselines |
alignContent (cross axis, multi-line)
Only applies when flexWrap: 'wrap' and there are multiple lines.
| Value | Behavior |
|---|---|
'flex-start' (default) | Lines at start |
'flex-end' | Lines at end |
'center' | Lines centered |
'space-between' | Equal gaps between lines |
'space-around' | Equal gaps around lines |
'stretch' | Lines stretch to fill |
alignSelf (per child override)
<View style={{ flexDirection: 'row', alignItems: 'flex-start' }}>
<View style={{ alignSelf: 'flex-end' }} /> {/* overrides parent alignItems */}
<View />
</View>Same values as alignItems.
flex / flexGrow / flexShrink / flexBasis
// flex: N — shorthand (sets flexGrow:N, flexShrink:1, flexBasis:0) <View style={{ flex: 1 }} /> // grows to fill available space // Manual control <View style={{ flexGrow: 1, flexShrink: 0, flexBasis: 100 }} /> // Fixed size, no grow/shrink <View style={{ width: 100, height: 100 }} />
| Property | Default | Notes |
|---|---|---|
flex | — | Shorthand (RN only accepts a number) |
flexGrow | 0 | How much to grow |
flexShrink | 1 | How much to shrink |
flexBasis | 'auto' | Starting size before grow/shrink |
flexWrap
<View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
{items.map(item => <View key={item.id} style={{ width: '33%' }} />)}
</View>| Value | Behavior |
|---|---|
'nowrap' (default) | Single line |
'wrap' | Wrap to next line |
'wrap-reverse' | Wrap to previous line |
gap / rowGap / columnGap
<View style={{ flexDirection: 'row', gap: 12 }}>
<View style={{ flex: 1 }} />
<View style={{ flex: 1 }} />
</View>
// Separate row and column gaps
<View style={{ flexWrap: 'wrap', rowGap: 8, columnGap: 16 }}>
{items}
</View>Note:
gaprequires React Native 0.71+ (Yoga engine update).
Common Layout Patterns
Full Screen
<View style={{ flex: 1 }}>
{/* fills parent */}
</View>Center Everything
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Centered</Text>
</View>Header + Scrollable Content + Footer
<View style={{ flex: 1 }}>
<View style={{ height: 56 }}>
{/* Header */}
</View>
<ScrollView style={{ flex: 1 }}>
{/* Content */}
</ScrollView>
<View style={{ height: 64 }}>
{/* Footer / Tab Bar */}
</View>
</View>Two-Column Grid (with gap)
<View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 12, padding: 16 }}>
{items.map(item => (
<View key={item.id} style={{ width: '48%' }}>
<Text>{item.name}</Text>
</View>
))}
</View>Sidebar + Content
<View style={{ flex: 1, flexDirection: 'row' }}>
<View style={{ width: 240 }}>
{/* Sidebar */}
</View>
<View style={{ flex: 1 }}>
{/* Main content */}
</View>
</View>Absolute overlay
<View style={{ flex: 1 }}>
<ScrollView>{/* content */}</ScrollView>
<View style={{
position: 'absolute',
bottom: 24,
right: 24,
}}>
<Pressable>
<Text>FAB</Text>
</Pressable>
</View>
</View>Spacer pattern
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<Text>Left</Text>
<View style={{ flex: 1 }} /> {/* pushes Right to end */}
<Text>Right</Text>
</View>position: 'absolute'
// Covers entire parent <View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0,0,0,0.5)', }} /> // OR <View style={[StyleSheet.absoluteFillObject, { backgroundColor: 'rgba(0,0,0,0.5)' }]} />
Gotcha: Unlike CSS, absolutely positioned children are still constrained to their parent's bounds unless the parent has
overflow: 'visible'. Android clips overflow by default — test both platforms.
aspectRatio
// Maintain 16:9 <View style={{ width: '100%', aspectRatio: 16 / 9, backgroundColor: '#000' }} /> // Square thumbnail <Image source={...} style={{ width: 80, aspectRatio: 1 }} />
Debugging Layout
// Quick visual debug — red border style={{ borderWidth: 1, borderColor: 'red' }} // Element inspector — press `j` in Metro to open React Native DevTools, // or shake the device → "Show Element Inspector" // The React DevTools Components panel shows Yoga layout values