décembre 21, 2025
15 min de lecture

Questions et réponses d’entretien React Native Junior

interview
career-advice
job-search
entry-level
Questions et réponses d’entretien React Native Junior
Milad Bonakdar

Milad Bonakdar

Auteur

Entraînez-vous aux questions React Native junior sur les composants, hooks, navigation, appels API, listes, AsyncStorage et bases mobiles.


Introduction

Dans un entretien junior React Native, on vérifie surtout si vous savez créer des écrans mobiles simples avec React, expliquer le rendu natif, gérer l’état avec les hooks, naviguer entre les écrans, appeler une API et stocker des données locales non sensibles. Une bonne réponse reste pratique : quel outil utiliser, quand l’éviter et quel compromis il crée sur iOS et Android.

Utilisez ce guide pour travailler les questions les plus probables lors d’un premier poste React Native. Concentrez-vous sur les bases de React, les composants clés, la navigation, les formulaires, les listes, les appels API, le stockage et le débogage mobile plutôt que sur des détails de bibliothèque appris par cœur.


Fondamentaux de React (6 Questions)

1. Qu'est-ce que React Native et en quoi diffère-t-il de React ?

Réponse :

  • React : Bibliothèque JavaScript pour la construction d'interfaces utilisateur web
  • React Native : Framework pour la construction d'applications mobiles natives en utilisant React
  • Différences clés :
    • React Native effectue le rendu vers des composants natifs (pas le DOM)
    • Utilise les API natives au lieu des API web
    • Approche de style différente (pas de CSS, utilise StyleSheet)
    • Code spécifique à la plateforme pour iOS et Android
// React (Web)
import React from 'react';

function App() {
  return <div className="container">Hello Web</div>;
}

// React Native (Mobile)
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

function App() {
  return (
    <View style={styles.container}>
      <Text>Hello Mobile</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Rareté : Très courant Difficulté : Facile


2. Quels sont les composants principaux de React Native ?

Réponse : React Native fournit des composants intégrés qui correspondent aux éléments d'interface utilisateur natifs :

  • View : Composant conteneur (comme div dans le web)
  • Text : Afficher du texte (tout le texte doit être dans un composant Text)
  • Image : Afficher des images
  • ScrollView : Conteneur défilable
  • TextInput : Champ de saisie de texte
  • TouchableOpacity/Pressable : Éléments tactiles
  • FlatList : Rendu de liste efficace
  • Button : Composant bouton de base
import {
  View,
  Text,
  Image,
  TextInput,
  TouchableOpacity,
  StyleSheet,
} from 'react-native';

function MyComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Bienvenue</Text>
      <Image source={{ uri: 'https://example.com/image.jpg' }} style={styles.image} />
      <TextInput placeholder="Entrez le nom" style={styles.input} />
      <TouchableOpacity style={styles.button} onPress={() => console.log('Pressed')}>
        <Text style={styles.buttonText}>Cliquez ici</Text>
      </TouchableOpacity>
    </View>
  );
}

Rareté : Très courant Difficulté : Facile


3. Expliquez la différence entre View et ScrollView.

Réponse :

  • View : Conteneur statique. Le contenu au-delà des limites de l'écran n'est pas défilable.
  • ScrollView : Conteneur défilable. Rend tous les enfants en même temps (peut être gourmand en mémoire pour les grandes listes).
  • Quand utiliser :
    • View : Pour les mises en page qui tiennent à l'écran
    • ScrollView : Pour de petites quantités de contenu défilable
    • FlatList : Pour les grandes listes (ne rend que les éléments visibles)
// View - non défilable
<View style={{ height: 200 }}>
  <Text>Contenu 1</Text>
  <Text>Contenu 2</Text>
  {/* Si le contenu dépasse 200px, il est coupé */}
</View>

// ScrollView - défilable
<ScrollView style={{ height: 200 }}>
  <Text>Contenu 1</Text>
  <Text>Contenu 2</Text>
  <Text>Contenu 3</Text>
  {/* Peut défiler pour voir tout le contenu */}
</ScrollView>

// FlatList - efficace pour les grandes listes
<FlatList
  data={items}
  renderItem={({ item }) => <Text>{item.name}</Text>}
  keyExtractor={item => item.id}
/>

Rareté : Très courant Difficulté : Facile


4. Que sont les Hooks React et lesquels sont les plus couramment utilisés ?

Réponse : Les Hooks sont des fonctions qui vous permettent d'utiliser l'état et les fonctionnalités du cycle de vie dans les composants fonctionnels.

  • Hooks courants :
    • useState : Gérer l'état du composant
    • useEffect : Gérer les effets secondaires (récupération de données, abonnements)
    • useContext : Accéder aux valeurs de contexte
    • useCallback : Mémoriser les fonctions
    • useMemo : Mémoriser les calculs coûteux
    • useRef : Référencer les éléments DOM ou conserver les valeurs
import React, { useState, useEffect } from 'react';
import { View, Text, Button } from 'react-native';

function Counter() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log(`Le compte est passé à : ${count}`);
    
    // Fonction de nettoyage
    return () => {
      console.log('Nettoyage');
    };
  }, [count]); // S'exécute lorsque le compte change
  
  return (
    <View>
      <Text>Compte : {count}</Text>
      <Button title="Incrémenter" onPress={() => setCount(count + 1)} />
    </View>
  );
}

Rareté : Très courant Difficulté : Facile


5. Expliquez le hook useEffect et son tableau de dépendances.

Réponse : useEffect exécute des effets secondaires après le rendu. Le tableau de dépendances contrôle quand il s'exécute :

  • Pas de tableau : S'exécute après chaque rendu
  • Tableau vide [] : S'exécute une fois après le rendu initial
  • Avec des dépendances [dep1, dep2] : S'exécute lorsque les dépendances changent
import { useEffect, useState } from 'react';

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  
  // S'exécute une fois au montage
  useEffect(() => {
    console.log('Composant monté');
  }, []);
  
  // S'exécute lorsque userId change
  useEffect(() => {
    fetchUser(userId).then(data => setUser(data));
  }, [userId]);
  
  // S'exécute après chaque rendu (à éviter)
  useEffect(() => {
    console.log('Rendu');
  });
  
  // Fonction de nettoyage
  useEffect(() => {
    const subscription = subscribeToUpdates();
    
    return () => {
      subscription.unsubscribe(); // Nettoyage au démontage
    };
  }, []);
  
  return <Text>{user?.name}</Text>;
}

Rareté : Très courant Difficulté : Moyenne


6. Qu'est-ce que le DOM virtuel et comment React l'utilise-t-il ?

Réponse : Le Virtual DOM est un concept de React côté web : React garde un arbre d’interface léger, le compare après les changements d’état et met à jour uniquement ce qui a changé. Dans React Native, la même idée de réconciliation s’applique, mais le résultat final est composé de vues natives, pas de nœuds DOM du navigateur.

  • Ce qu’il faut dire en entretien :
    1. Les changements d’état déclenchent un nouveau rendu des composants concernés
    2. React compare le nouvel arbre de composants avec le précédent
    3. React Native applique les mises à jour nécessaires aux composants UI natifs
    4. On optimise toujours avec des clés stables, un état bien placé et de la mémoïsation seulement quand elle résout un vrai problème de re-render
  • Correction importante : React Native ne met pas à jour du HTML ni le DOM du navigateur.

Rareté : Courant Difficulté : Facile


Composants & Props (4 Questions)

7. Quelle est la différence entre Props et State ?

Réponse :

  • Props :
    • Passées du parent à l'enfant
    • En lecture seule (immuables)
    • Utilisées pour la configuration du composant
  • State :
    • Géré au sein du composant
    • Mutable (peut être modifié)
    • Utilisé pour les données dynamiques
// Composant parent
function ParentComponent() {
  const [count, setCount] = useState(0);
  
  return (
    <ChildComponent 
      title="Compteur"  // Props
      count={count}    // Props
      onIncrement={() => setCount(count + 1)}  // Props
    />
  );
}

// Composant enfant
function ChildComponent({ title, count, onIncrement }) {
  // Impossible de modifier les props
  // title = "Nouveau titre"; // Erreur !
  
  return (
    <View>
      <Text>{title}</Text>
      <Text>Compte : {count}</Text>
      <Button title="Incrémenter" onPress={onIncrement} />
    </View>
  );
}

Rareté : Très courant Difficulté : Facile


8. Que sont les composants fonctionnels par rapport aux composants de classe ?

Réponse :

  • Composants fonctionnels :
    • Syntaxe plus simple
    • Utiliser des hooks pour l'état et le cycle de vie
    • Préférés dans React moderne
  • Composants de classe :
    • Approche plus ancienne
    • Utiliser this.state et les méthodes de cycle de vie
    • Toujours pris en charge, mais moins courant
// Composant fonctionnel (moderne)
function Welcome({ name }) {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log('Monté');
  }, []);
  
  return <Text>Bonjour, {name}</Text>;
}

// Composant de classe (hérité)
class Welcome extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  
  componentDidMount() {
    console.log('Monté');
  }
  
  render() {
    return <Text>Bonjour, {this.props.name}</Text>;
  }
}

Rareté : Courant Difficulté : Facile


9. Comment transmettez-vous des données du composant enfant au composant parent ?

Réponse : Utilisez des fonctions de rappel passées en tant que props.

// Composant parent
function ParentComponent() {
  const [message, setMessage] = useState('');
  
  const handleMessageFromChild = (msg) => {
    setMessage(msg);
  };
  
  return (
    <View>
      <Text>Message de l'enfant : {message}</Text>
      <ChildComponent onSendMessage={handleMessageFromChild} />
    </View>
  );
}

// Composant enfant
function ChildComponent({ onSendMessage }) {
  const [input, setInput] = useState('');
  
  const sendMessage = () => {
    onSendMessage(input); // Appeler la fonction du parent
  };
  
  return (
    <View>
      <TextInput value={input} onChangeText={setInput} />
      <Button title="Envoyer au parent" onPress={sendMessage} />
    </View>
  );
}

Rareté : Très courant Difficulté : Facile


10. Qu'est-ce que la prop key et pourquoi est-elle importante ?

Réponse : La prop key aide React à identifier quels éléments ont été modifiés, ajoutés ou supprimés dans les listes.

  • Objectif : Optimiser les performances de rendu
  • Exigences : Doit être unique parmi les frères et sœurs, stable (n'utilisez pas l'index si la liste peut changer)
// Bien - utiliser un ID unique
function UserList({ users }) {
  return (
    <FlatList
      data={users}
      keyExtractor={item => item.id} // Clé unique
      renderItem={({ item }) => <Text>{item.name}</Text>}
    />
  );
}

// Mauvais - utiliser l'index (à éviter si la liste peut changer)
function BadList({ items }) {
  return (
    <View>
      {items.map((item, index) => (
        <Text key={index}>{item}</Text> // N'utilisez pas l'index
      ))}
    </View>
  );
}

// Bien - utiliser une propriété unique
function GoodList({ items }) {
  return (
    <View>
      {items.map(item => (
        <Text key={item.id}>{item.name}</Text>
      ))}
    </View>
  );
}

Rareté : Très courant Difficulté : Facile


Style & Mise en page (3 Questions)

11. Comment styliser les composants dans React Native ?

Réponse : React Native utilise des objets JavaScript pour le style, pas du CSS.

  • API StyleSheet : Créer des styles optimisés
  • Styles en ligne : Objets de style directs (moins performants)
  • Flexbox : Système de mise en page par défaut
import { View, Text, StyleSheet } from 'react-native';

function StyledComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Titre</Text>
      <Text style={[styles.text, styles.bold]}>Styles multiples</Text>
      <Text style={{ color: 'red' }}>Style en ligne</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#fff',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: '#333',
  },
  text: {
    fontSize: 16,
    color: '#666',
  },
  bold: {
    fontWeight: 'bold',
  },
});

Rareté : Très courant Difficulté : Facile


12. Expliquez Flexbox dans React Native.

Réponse : Flexbox est le principal système de mise en page dans React Native.

  • Propriétés principales :
    • flexDirection : row ou column (par défaut : column)
    • justifyContent : Aligner le long de l'axe principal
    • alignItems : Aligner le long de l'axe transversal
    • flex : Dimensionnement proportionnel
const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row', // Mise en page horizontale
    justifyContent: 'space-between', // Espacer les éléments uniformément
    alignItems: 'center', // Centrer verticalement
  },
  box1: {
    flex: 1, // Prend 1/3 de l'espace
    backgroundColor: 'red',
  },
  box2: {
    flex: 2, // Prend 2/3 de l'espace
    backgroundColor: 'blue',
  },
});

function FlexExample() {
  return (
    <View style={styles.container}>
      <View style={styles.box1} />
      <View style={styles.box2} />
    </View>
  );
}

Rareté : Très courant Difficulté : Moyenne


13. Quelle est la différence entre margin et padding ?

Réponse :

  • Padding : Espace à l'intérieur du composant (entre le contenu et la bordure)
  • Margin : Espace à l'extérieur du composant (entre le composant et les voisins)
const styles = StyleSheet.create({
  box: {
    margin: 20,        // Espace extérieur
    padding: 10,       // Espace intérieur
    backgroundColor: 'lightblue',
  },
  // Côtés spécifiques
  specificBox: {
    marginTop: 10,
    marginBottom: 20,
    paddingLeft: 15,
    paddingRight: 15,
  },
  // Horizontal et vertical
  shorthand: {
    marginHorizontal: 20,  // gauche et droite
    marginVertical: 10,    // haut et bas
    paddingHorizontal: 15,
    paddingVertical: 5,
  },
});

Rareté : Courant Difficulté : Facile


14. Qu'est-ce que React Navigation et comment l'utilisez-vous ?

Réponse : React Navigation est la bibliothèque de navigation la plus populaire pour React Native.

  • Types :
    • Stack Navigator : Pile d'écrans (push/pop)
    • Tab Navigator : Onglets inférieurs
    • Drawer Navigator : Menu latéral
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

function HomeScreen({ navigation }) {
  return (
    <View>
      <Text>Écran d'accueil</Text>
      <Button
        title="Aller aux détails"
        onPress={() => navigation.navigate('Details', { itemId: 42 })}
      />
    </View>
  );
}

function DetailsScreen({ route, navigation }) {
  const { itemId } = route.params;
  
  return (
    <View>
      <Text>Écran des détails</Text>
      <Text>ID de l'élément : {itemId}</Text>
      <Button title="Revenir en arrière" onPress={() => navigation.goBack()} />
    </View>
  );
}

Rareté : Très courant Difficulté : Moyenne


15. Comment passez-vous des paramètres entre les écrans ?

Réponse : Utilisez la fonction navigate avec un deuxième paramètre pour les données.

// Naviguer avec des paramètres
function HomeScreen({ navigation }) {
  const user = { id: 1, name: 'John', email: '[email protected]' };
  
  return (
    <Button
      title="Voir le profil"
      onPress={() => navigation.navigate('Profile', { user })}
    />
  );
}

// Recevoir des paramètres
function ProfileScreen({ route }) {
  const { user } = route.params;
  
  return (
    <View>
      <Text>Nom : {user.name}</Text>
      <Text>Email : {user.email}</Text>
    </View>
  );
}

// Mettre à jour les paramètres
function EditScreen({ navigation }) {
  const updateUser = () => {
    navigation.setParams({ user: updatedUser });
  };
  
  return <Button title="Mettre à jour" onPress={updateUser} />;
}

Rareté : Très courant Difficulté : Facile


16. Quelles sont les options de navigation et comment personnalisez-vous les en-têtes ?

Réponse : Les options de navigation contrôlent l'apparence et le comportement de l'écran.

function HomeScreen({ navigation }) {
  useEffect(() => {
    navigation.setOptions({
      title: 'Mon accueil',
      headerStyle: {
        backgroundColor: '#f4511e',
      },
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',
      },
      headerRight: () => (
        <Button title="Info" onPress={() => alert('Info')} />
      ),
    });
  }, [navigation]);
  
  return <View><Text>Accueil</Text></View>;
}

// Ou définir dans le navigateur
<Stack.Screen
  name="Home"
  component={HomeScreen}
  options={{
    title: 'Mon accueil',
    headerStyle: { backgroundColor: '#f4511e' },
    headerTintColor: '#fff',
  }}
/>

Rareté : Courant Difficulté : Facile


Données & Stockage (4 Questions)

17. Comment récupérez-vous des données à partir d'une API dans React Native ?

Réponse : Utilisez l'API fetch ou des bibliothèques comme Axios.

import { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';

function UserList() {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  
  useEffect(() => {
    fetchUsers();
  }, []);
  
  const fetchUsers = async () => {
    try {
      const response = await fetch('https://api.example.com/users');
      
      if (!response.ok) {
        throw new Error('La réponse du réseau n'était pas ok');
      }
      
      const data = await response.json();
      setUsers(data);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };
  
  if (loading) return <ActivityIndicator />;
  if (error) return <Text>Erreur : {error}</Text>;
  
  return (
    <FlatList
      data={users}
      renderItem={({ item }) => <Text>{item.name}</Text>}
      keyExtractor={item => item.id.toString()}
    />
  );
}

Rareté : Très courant Difficulté : Moyenne


18. Qu'est-ce qu'AsyncStorage et comment l'utilisez-vous ?

Réponse : AsyncStorage est un stockage asynchrone clé-valeur pour de petites données non sensibles.

  • Bons cas d’usage : Choix du thème, étapes d’onboarding, JSON en cache, préférences simples
  • À éviter pour : Tokens d’authentification, clés API, mots de passe, grands volumes de données et données nécessitant des requêtes complexes
  • Pour les données sensibles : Utilisez un stockage sécurisé fourni par la plateforme, comme iOS Keychain ou le stockage chiffré Android via une bibliothèque maintenue
import AsyncStorage from '@react-native-async-storage/async-storage';

const savePreference = async (theme) => {
  await AsyncStorage.setItem('theme', theme);
};

const loadPreference = async () => {
  return await AsyncStorage.getItem('theme');
};

Rareté : Très courant Difficulté : Facile


19. Quelle est la différence entre FlatList et ScrollView ?

Réponse :

  • ScrollView :
    • Rend tous les enfants en même temps
    • Bon pour les petites listes
    • Gourmand en mémoire pour les grandes listes
  • FlatList :
    • Ne rend que les éléments visibles (chargement paresseux)
    • Efficace pour les grandes listes
    • Optimisations intégrées
// ScrollView - rend tout
<ScrollView>
  {items.map(item => (
    <View key={item.id}>
      <Text>{item.name}</Text>
    </View>
  ))}
</ScrollView>

// FlatList - ne rend que les éléments visibles
<FlatList
  data={items}
  renderItem={({ item }) => (
    <View>
      <Text>{item.name}</Text>
    </View>
  )}
  keyExtractor={item => item.id}
  // Optimisations des performances
  initialNumToRender={10}
  maxToRenderPerBatch={10}
  windowSize={5}
/>

Rareté : Très courant Difficulté : Facile


20. Comment gérez-vous les formulaires et la saisie utilisateur ?

Réponse : Utilisez des composants contrôlés avec l'état.

import { useState } from 'react';
import { View, TextInput, Button, Text } from 'react-native';

function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});
  
  const validate = () => {
    const newErrors = {};
    
    if (!email) {
      newErrors.email = 'L\'email est requis';
    } else if (!/\S+@\S+\.\S+/.test(email)) {
      newErrors.email = 'L\'email n\'est pas valide';
    }
    
    if (!password) {
      newErrors.password = 'Le mot de passe est requis';
    } else if (password.length < 6) {
      newErrors.password = 'Le mot de passe doit contenir au moins 6 caractères';
    }
    
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };
  
  const handleSubmit = () => {
    if (validate()) {
      console.log('Formulaire soumis :', { email, password });
      // Soumettre à l'API
    }
  };
  
  return (
    <View>
      <TextInput
        placeholder="Email"
        value={email}
        onChangeText={setEmail}
        keyboardType="email-address"
        autoCapitalize="none"
      />
      {errors.email && <Text style={{ color: 'red' }}>{errors.email}</Text>}
      
      <TextInput
        placeholder="Mot de passe"
        value={password}
        onChangeText={setPassword}
        secureTextEntry
      />
      {errors.password && <Text style={{ color: 'red' }}>{errors.password}</Text>}
      
      <Button title="Se connecter" onPress={handleSubmit} />
    </View>
  );
}

Rareté : Très courant Difficulté : Moyenne

Newsletter subscription

Conseils de carrière hebdomadaires qui fonctionnent vraiment

Recevez les dernières idées directement dans votre boîte de réception

Créez un CV qui Vous Fait Embaucher 60% Plus Vite

En quelques minutes, créez un CV personnalisé et compatible ATS qui a prouvé obtenir 6 fois plus d'entretiens.

Créer un meilleur CV

Partager cet article

Faites Compter Vos 6 Secondes

Les recruteurs scannent les CV pendant seulement 6 à 7 secondes en moyenne. Nos modèles éprouvés sont conçus pour capter l'attention instantanément et les inciter à continuer la lecture.