Skip to Content
React Native20. QuizQuiz 2 — État & données

Quiz 2 — État & données (P6-P8)

20 questions · ~15 min

1. La règle de répartition de l’état du cours, en une phrase ?

Réponse

Le plus local possible : useState pour l’UI locale, Zustand pour le partagé éphémère (session), AsyncStorage/persist pour les préférences, SQLite pour les données requêtables.

2. Où la mémoïsation (memo/useCallback) est-elle rentable en RN ?

Réponse

Autour des FlatList (items memo, handlers stables) et des composants mémoïsés — partout ailleurs, c’est du bruit (profiler d’abord).

3. Pourquoi un setInterval n’est-il pas fiable pour un timer de jeu ?

Réponse

Le JS est gelé/throttlé en arrière-plan : les ticks se perdent. La vérité = endsAt comparé à Date.now() (+ resync au retour AppState).

4. useFocusEffect vs useEffect : quand le premier est-il indispensable ?

Réponse

Pour réagir à chaque visite d’un écran (les écrans restent montés sous pile/tabs — useEffect([]) ne joue qu’au montage initial).

5. La discipline n°1 de consommation d’un store Zustand ?

Réponse

Les sélecteurs fins (useSession(s => s.score)) — jamais le store entier, qui abonne le composant à tout changement.

6. Comment un listener non-React (notification, BackHandler) lit-il le store ?

Réponse

useStore.getState() / setState() — l’accès hors composants, sans hook ni abonnement.

7. Pourquoi modéliser la partie en union discriminée plutôt qu’en booléens ?

Réponse

Chaque phase porte SES données (endsAt qu’en playing), les combinaisons absurdes sont irreprésentables, TS force l’exhaustivité — et les gardes refusent les transitions illégales.

8. Que fait le middleware persist de Zustand, et ses deux options structurantes ?

Réponse

Sérialise le store dans AsyncStorage à chaque set et le réhydrate au démarrage — name (la clé) et version+migrate (les évolutions sans casser les données).

9. Trois choses qu’on ne met JAMAIS dans AsyncStorage ?

Réponse

Les secrets (→ expo-secure-store), les données de masse/requêtables (→ SQLite), et tout objet non-JSON-sérialisable.

10. Pourquoi n’y a-t-il pas de CORS en React Native, et le revers de sécurité ?

Réponse

Pas de navigateur → pas de same-origin. Revers : tout ce qui est dans l’app est PUBLIC (décompilable) — aucune clé secrète embarquée, jamais.

11. staleTime et gcTime : les définitions exactes ?

Réponse

staleTime = fraîcheur (frais → servi du cache sans réseau ; stale → servi + refetch en fond). gcTime = rétention mémoire d’une donnée inutilisée avant éviction.

12. Les deux branchements RN de TanStack Query au démarrage ?

Réponse

onlineManager ← NetInfo et focusManager ← AppState — les remplaçants des événements window du web (reconnexion, retour au premier plan).

13. L’architecture des questions de Drill (ADR 0001) en une phrase ?

Réponse

JSON par thème dans un repo GitHub public servi par raw.githubusercontent, fetch + zod + cache offline — mise à jour par git push, zéro serveur, scores locaux.

14. Parse strict vs safeParse dans le pipeline de questions : la doctrine ?

Réponse

Strict sur l’ENVELOPPE du fichier (corrompu = erreur franche), safeParse PAR QUESTION (une invalide = ignorée + warning, le jeu continue) — tolérance proportionnée au dégât.

15. À quoi sert z.infer dans l’architecture ?

Réponse

Les types TS dérivent du schéma zod (une seule source de vérité) : validation runtime et types compilés ne peuvent plus diverger.

16. La matrice offline : que voit l’utilisateur hors ligne avec cache ? sans cache ?

Réponse

Avec : les données + bandeau (un MODE, pas une erreur). Sans : ErrorState + retry + la banque de secours bundlée (jouable même à la première ouverture en avion).

17. Pourquoi gcTime doit-il couvrir maxAge dans la persistance du cache Query ?

Réponse

On ne persiste que ce qui est en mémoire : une donnée garbage-collectée avant maxAge n’existe plus au moment de sauvegarder.

18. Écrivez (de tête) la requête du taux de réussite d’un thème, pièges compris.

Réponse

SELECT CAST(SUM(correct_count) AS REAL) / NULLIF(SUM(total), 0) FROM sessions WHERE theme = ? — CAST contre la division entière, NULLIF contre la division par zéro, paramètre contre l’injection.

19. Le pattern de migrations SQLite du cours ?

Réponse

PRAGMA user_version + tableau ordonné de migrations + une transaction chacune — on n’édite JAMAIS une migration livrée, on en ajoute. (Et foreign_keys = ON à chaque ouverture !)

20. staleTime: Infinity sur les stats locales : la logique ?

Réponse

Elles ne changent que par NOS écritures : l’invalidation explicite (onSuccess de la mutation) est le seul rafraîchissement nécessaire — zéro re-requête spontanée.