Cours React Native Complet 📱

Les 12 chapitres essentiels — Expo, composants natifs, navigation, API et publication

12
Chapitres
100+
Exemples de code
Expo 52+
Version
A1→C2
Niveaux

CHAPITRE 01

Introduction et installation

📱 Premier projet avec Expo
# Créer un projet Expo (recommandé)
npx create-expo-app@latest mon-app
cd mon-app

# Lancer
npx expo start

# Tester :
# → Scanner le QR code avec Expo Go (téléphone)
# → Appuyer sur 'i' pour iOS simulator
# → Appuyer sur 'a' pour Android emulator
# → Appuyer sur 'w' pour le web

// app/(tabs)/index.tsx
import from 'react-native';

export default function HomeScreen()

const styles = StyleSheet.create();

React Native est un framework de Meta pour créer des apps natives iOS et Android avec React et JavaScript/TypeScript. Contrairement à Flutter, il utilise les vrais composants natifs de chaque plateforme. Utilisé par Meta, Microsoft, Shopify, Discord et Coinbase. Expo est le framework recommandé pour démarrer.

🏗️ React Native vs React Web
React Web React Native

,

(obligatoire pour tout texte)

    CSS / className StyleSheet / style=
    Flexbox (row défaut) Flexbox (column défaut)

    CHAPITRE 02

    Composants de base

    🧱 Composants natifs essentiels
    import from 'react-native';

    // Text — tout texte doit être dans
    style=>
    Titre

    // Image

    source=
    style=
    />
    source= />

    // Pressable — bouton custom (remplace TouchableOpacity)

    onPress=
    style=
    >
    style=>Cliquer

    // ScrollView — contenu scrollable
    contentContainerStyle=>
    Contenu long…

    // ActivityIndicator — spinner de chargement
    size=« large » color=« #2563eb » />

    Tout texte doit être dans . Contrairement au web, React Native ne permet pas de texte en dehors de . Texte → erreur. Texte → correct.

    CHAPITRE 03

    StyleSheet et layout

    🎨 StyleSheet
    import from 'react-native';

    const styles = StyleSheet.create();

    📐 Flexbox (column par défaut)
    // Centrer parfaitement
    style=>
    Centré !

    // Row — aligner horizontalement
    style=>
    Gauche
    Droite

    // flex: 1 = prendre tout l'espace restant
    style=>
    style=>Fixe
    style=>Flexible

    // gap (React Native 0.71+)
    style=>
    Item 1
    Item 2

    Flexbox en React Native est en column par défaut (vertical), contrairement au web (row). justifyContent agit sur l'axe principal (vertical), alignItems sur l'axe secondaire (horizontal). Toutes les dimensions sont en dp (density-independent pixels), pas en px.

    CHAPITRE 04

    State et hooks

    🔄 Hooks React (identiques au web)
    import from 'react';

    export default function Counter()

    Les hooks sont 100% identiques à React web. useState, useEffect, useCallback, useMemo, useRef, useContext — tout fonctionne pareil. La seule différence est le rendu : des composants natifs au lieu du HTML.

    CHAPITRE 05

    Listes

    📋 FlatList
    import from 'react-native';


    data=
    keyExtractor=
    renderItem=
    ItemSeparatorComponent=
    ListEmptyComponent=
    refreshing=
    onRefresh= // Pull to refresh
    onEndReached= // Pagination infinie
    onEndReachedThreshold=
    />

    // SectionList — liste avec sections (headers)
    import from 'react-native';


    sections=
    renderSectionHeader=
    renderItem=
    />

    Ne jamais utiliser ScrollView + map() pour de longues listes. FlatList est virtualisé — il ne rend que les items visibles à l'écran. ScrollView rend TOUS les items en mémoire, ce qui cause des problèmes de performance avec > 50 items.

    CHAPITRE 06

    Navigation

    🧭 Expo Router (file-based routing)
    // Expo Router = file-based routing (comme Next.js)
    // Structure des fichiers = routes
    //
    // app/
    // _layout.tsx → Layout racine
    // index.tsx → Route « / »
    // (tabs)/
    // _layout.tsx → Tab bar layout
    // index.tsx → Tab « Accueil »
    // search.tsx → Tab « Chercher »
    // profile.tsx → Tab « Profil »
    // post/
    // [id].tsx → Route dynamique /post/42
    // app/(tabs)/_layout.tsx — Tab bar
    import from 'expo-router';
    import from '@expo/vector-icons';

    export default function TabLayout()

    // Naviguer
    import from 'expo-router';

    // Push
    router.push('/post/42');
    router.push();

    // Remplacer
    router.replace('/login');

    // Retour
    router.back();

    // Lire les params (dans post/[id].tsx)
    const = useLocalSearchParams<>();

    CHAPITRE 07

    Formulaires

    📝 TextInput
    import from 'react';
    import from 'react-native';

    export default function LoginForm() {
    const [email, setEmail] = useState( »);
    const [password, setPassword] = useState( »);

    const handleSubmit = () => {
    if (!email || !password) {
    Alert.alert('Erreur', 'Remplissez tous les champs');
    return;
    }
    // Envoyer…
    };

    return (
    style={{ gap: 12, padding: 16 }}>

    placeholder=« Email »
    value={email}
    onChangeText={setEmail}
    keyboardType=« email-address »
    autoCapitalize=« none »
    style={styles.input}
    />

    placeholder=« Mot de passe »
    value={password}
    onChangeText={setPassword}
    secureTextEntry
    style={styles.input}
    />
    onPress={handleSubmit} style={styles.button}>
    style=>Connexion


    );
    }

    CHAPITRE 08

    HTTP et API

    🌐 Fetch API + TanStack Query
    // fetch natif — identique au web
    async function fetchPosts()
    // TanStack Query (recommandé) — cache, refetch, loading/error
    // npm install @tanstack/react-query

    import from '@tanstack/react-query';

    export default function PostList() {
    const { data: posts, isLoading, error } = useQuery({
    queryKey: ['posts'],
    queryFn: fetchPosts,
    });

    if (isLoading) return size=« large » />;
    if (error) return Erreur: {error.message};

    return (

    data=
    keyExtractor=
    renderItem={({ item }) => {item.title}}
    />
    );
    }

    // Mutation (POST, PUT, DELETE)
    const queryClient = useQueryClient();
    const mutation = useMutation();

    CHAPITRE 09

    State management

    📊 Zustand (recommandé)
    // npm install zustand
    import from 'zustand';

    // Créer un store
    const useAuthStore = create((set) => ());

    // Utiliser dans un composant
    export default function Profile()

    Solution Complexité Idéal pour
    useState + Context Simple Petit état partagé
    Zustand Simple État global (recommandé)
    TanStack Query Moyen État serveur (API, cache)
    Redux Toolkit Complexe Apps enterprise, logique complexe

    CHAPITRE 10

    Stockage et natif

    💾 AsyncStorage et APIs natives
    // npx expo install @react-native-async-storage/async-storage
    import AsyncStorage from '@react-native-async-storage/async-storage';

    // Sauvegarder
    await AsyncStorage.setItem('token', 'abc123');
    await AsyncStorage.setItem('user', JSON.stringify(user));

    // Lire
    const token = await AsyncStorage.getItem('token');
    const user = JSON.parse(await AsyncStorage.getItem('user'));

    // Supprimer
    await AsyncStorage.removeItem('token');

    // expo-secure-store — pour les données sensibles (tokens, passwords)
    // npx expo install expo-secure-store
    import * as SecureStore from 'expo-secure-store';
    await SecureStore.setItemAsync('token', 'secret');

    // APIs natives Expo
    // npx expo install expo-camera expo-location expo-notifications

    // Caméra
    import from 'expo-camera';

    // Géolocalisation
    import * as Location from 'expo-location';
    const = await Location.requestForegroundPermissionsAsync();
    const loc = await Location.getCurrentPositionAsync();

    // Notifications push
    import * as Notifications from 'expo-notifications';

    CHAPITRE 11

    Publication

    🚀 EAS Build (Expo Application Services)
    # Installer EAS CLI
    npm install -g eas-cli
    eas login

    # Configurer
    eas build:configure

    # Build pour les stores
    eas build –platform android # → .aab pour Play Store
    eas build –platform ios # → .ipa pour App Store
    eas build –platform all # Les deux

    # Soumettre aux stores
    eas submit –platform android
    eas submit –platform ios

    # Update Over-The-Air (OTA) — sans repasser par les stores !
    eas update –branch production –message « Fix bug »

    EAS Update = mises à jour instantanées sans repasser par les stores. Les changements JS/assets sont envoyés directement aux utilisateurs. Seuls les changements de code natif (nouvelles permissions, nouveau SDK) nécessitent un nouveau build store.

    📋 Checklist publication
    Étape Outil
    Icône et splash screen app.json → icon, splash
    Build production eas build
    Tests sur device réel Expo Go / Development Build
    Google Play Console 25$ une fois
    App Store Connect 99$/an (Apple Developer)
    OTA updates eas update

    CHAPITRE 12

    Bonnes pratiques

    🧩 Stack technique recommandé
    Besoin Outil
    Framework Expo (avec Expo Router)
    Navigation Expo Router (file-based)
    State global Zustand
    State serveur TanStack Query
    Stockage AsyncStorage + SecureStore
    UI NativeWind (Tailwind pour RN) ou Tamagui
    Icônes @expo/vector-icons
    Animations react-native-reanimated
    Formulaires react-hook-form + zod
    ✅ Bonnes pratiques

    ✅ À FAIRE
    FlatList pour les listes (virtualisé)
    Pressable au lieu de TouchableOpacity
    • TypeScript
    • Expo Router (file-based)
    • TanStack Query pour les API
    • Zustand pour l'état global
    • Tester sur iOS ET Android
    expo-secure-store pour les tokens
    • Animations avec Reanimated

    ❌ À ÉVITER
    • ScrollView + map() pour les listes
    • Inline styles partout (utiliser StyleSheet)
    • Ignorer les différences iOS/Android
    • console.log en production
    • Images non optimisées
    • Pas de gestion d'erreurs réseau
    • State global dans Context (perf)
    • Ignorer les permissions (caméra, GPS)
    • Oublier de tester sur device réel

    🧠 Quiz
    Expo vs React Native CLI — quand choisir quoi ?
    Expo = recommandé pour 95% des projets. Il gère le build, le déploiement, les APIs natives, et les OTA updates. React Native CLI = uniquement si vous avez besoin de modules natifs custom très spécifiques non supportés par Expo. Depuis Expo 50+, vous pouvez ajouter du code natif custom avec les « development builds ».
    Pourquoi NativeWind (Tailwind) pour le style ?
    NativeWind apporte la syntaxe Tailwind à React Native : className= »flex-1 bg-white p-4″. Avantages : prototypage rapide, cohérence avec le web, pas de StyleSheet.create, responsive, dark mode. C'est le même système de classes que Tailwind CSS web.

    Cours React Native Complet — Expo, composants natifs, navigation et publication

    Référence : reactnative.dev | Expo | NativeWind