react-native
Build performant cross-platform mobile apps with React Native components, navigation, and native modules.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
React Native Development Rules
Component Performance
-
FlatListfor any list over 10 items —ScrollViewwithmaploads everything in memory, FlatList virtualizes -
keyExtractormust return stable unique strings — using index causes bugs on reorder and deletion -
React.memoprevents re-renders when props unchanged — wrap pure display components -
useCallbackfor functions passed to child components — new function reference triggers child re-render - Avoid inline styles in render — creates new object every render, extract to
StyleSheet.create
State Management
-
useStateis fine for component-local state — don't add Redux/Zustand for a toggle - Lift state to lowest common ancestor only — higher causes unnecessary re-renders
-
useMemofor expensive computations — but don't overuse, caching has overhead - Context re-renders all consumers on any change — split contexts by update frequency
- Avoid storing derived data in state — compute during render from source state
Navigation
- React Navigation is the standard — Expo Router for file-based routing in Expo projects
- Stack screens stay mounted by default — clean up subscriptions and timers in
useEffectcleanup - Pass serializable params only — functions and complex objects break deep linking and state persistence
-
useFocusEffectfor screen-specific side effects — runs on focus, not just mount -
navigation.resetfor auth flows — clears back stack, prevents returning to login after sign-in
Styling
-
StyleSheet.createoutside component body — creates styles once, not every render - Flexbox defaults differ from web —
flexDirection: 'column', nodisplay: flexneeded - Dimensions in density-independent pixels — don't use pixel values from design tools directly
-
Platform.selectfor platform-specific styles — cleaner than conditionals in style objects - No CSS inheritance — text styles don't cascade, each Text needs explicit styling
Native Modules
- Expo modules cover most needs — avoid ejecting for common features like camera, location, notifications
-
expo-dev-clientenables native modules without full eject — best of both worlds - React Native New Architecture (Fabric, TurboModules) is opt-in — check library compatibility before enabling
- Native crashes don't show in JS debugger — check Xcode/Android Studio logs
Performance Debugging
- Hermes engine should be enabled — significantly faster startup and lower memory
-
InteractionManager.runAfterInteractionsdefers heavy work — keeps animations smooth -
useNativeDriver: truefor animations — runs on UI thread, not JS thread -
console.login production kills performance — remove or use__DEV__guard - Flipper for debugging — network, layout, performance profiling
Images
- Use
resizeModeappropriately —covercrops,containletterboxes,stretchdistorts - Prefetch images for smooth UX:
Image.prefetch(url)before displaying - Local images need explicit dimensions — remote images can use aspect ratio if one dimension set
- SVGs via
react-native-svg— better scaling than PNGs for icons - Cache remote images with
react-native-fast-image— default Image has no persistent cache
Common Mistakes
-
asyncinuseEffectdirectly — must define async function inside, then call it - Missing
keywarnings in lists — always use unique, stable keys - Assuming web React patterns work — no DOM, no CSS, different event system
- Forgetting cleanup in
useEffect— subscriptions, timers, listeners leak without cleanup return - Testing only on one platform — iOS and Android differ in behavior, test both regularly
Platform Differences
- Android needs explicit
overflow: 'hidden'for border radius clipping — iOS clips by default - Shadows: iOS uses
shadow*props, Android useselevation - StatusBar behavior differs — test visibility and color on both platforms
- Back button is Android-only — handle with
BackHandleror navigation listeners - Push notifications setup differs significantly — platform-specific configuration required
Build & Release
-
npx react-native cleanfor unexplained build failures — clears caches and derived data - iOS:
cd ios && pod installafter adding native dependencies — often forgotten step - Android:
cd android && ./gradlew cleanfor stubborn build issues - EAS Build (Expo) simplifies CI/CD — handles signing, versioning, submission
- Test release builds locally before submitting — development and production behavior differ
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-03-11
- Index updated
- 2026-03-11
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!