Aller directement au contenu principal
Mobile Guides

Maîtriser l'alerte React Native : API Guide & Meilleures Pratiques

Maîtrisez l'alerte React Native API. Créez des alertes, des confirmations et gérez les différences de plateforme avec les meilleures pratiques pour l'accessibilité.

Martin Donadieu

Martin Donadieu

Spécialiste du contenu

Maîtriser l'alerte React Native : API Guide & Meilleures Pratiques

Vous déclenchez Alert.alert() dans React Native, testez sur iPhone et Android, et cela semble terminé. Puis quelqu'un ouvre la version web et rien n'apparaît. Ou Android ignore le flux de demande que vous avez utilisé sur iOS. Ou deux parties de l'application déclenchent des alertes à la fois et l'utilisateur se retrouve coincé dans un empilement de dialogues chaotique.

Voilà la forme de l'alerte React Native API. C'est génial pour des flux de confirmation rapides et natifs. C'est aussi étroit, lié à la plateforme et facile à mal utiliser en production. La bonne nouvelle est que le chemin heureux est simple, et les bords rugueux sont prévisibles une fois que vous savez où ils sont.

Table des Matières

Afficher des messages simples avec Alert.alert

Pour une interface utilisateur de notification de base, React Native Alert est toujours l'outil le plus rapide dans la boîte. Vous importez Alert, appelez Alert.alert(), et la plateforme affiche un dialogue natif.

Aucune dépendance supplémentaire, aucun état modal personnalisé, aucun travail de style.

import React from 'react';
import { View, Button, Alert } from 'react-native';

export default function ProfileScreen() {
  const showSavedMessage = () => {
    Alert.alert('Profile updated', 'Your changes were saved successfully.');
  };

  return (
    <View style={{ padding: 24 }}>
      <Button title="Save profile" onPress={showSavedMessage} />
    </View>
  );
}

La version la plus simple n'a besoin que d'un titre et d'un message :

Vue rapprochée d'une personne utilisant un smartphone montrant un message d'alerte simple sur l'écran.

Ce modèle fonctionne bien lorsque l'utilisateur n'a pas besoin de prendre une décision significative. Pensez à « paramètres enregistrés », « session expirée » ou « fonctionnalité indisponible pour le moment ». Le dialogue interrompt le flux, il doit donc transmettre des informations dont l'utilisateur a besoin immédiatement, et non des bruits de statut mineurs.

Ce que la mise en appel de base vous donne Alert.alert(title, message) Un simple

est utile car il reste natif. Le système d'exploitation gère la présentation visuelle, les rôles des boutons et le modèle d'interaction standard. Pour beaucoup d'équipes, c'est exactement le bon compromis.

  • Un certain nombre de règles pratiques aident à le rendre utile : « Utilisez un titre direct ». L'upload a échoué
  • Gardez le message court. Les avertissements sont pour un contexte immédiat, pas une explication de longue haleine.
  • Réservez les avertissements pour les informations bloquantes. Si l'utilisateur peut continuer sans interruption, un toast est souvent un meilleur choix.

Gardez les avertissements courts et décisifs. Si l'utilisateur a besoin de lire un paragraphe, le dialogue est probablement le mauvais UI.

Où les équipes abusent de cela

L'erreur la plus courante est d'utiliser les avertissements comme un système de messagerie générique. Si chaque action de succès montre un dialogue bloquant, l'application commence à sentir lourde rapidement.

Les avertissements natifs sont les plus forts lorsqu'ils arrêtent l'utilisateur pour une raison. Une autre erreur est de coupler les avertissements trop étroitement aux composants internes. Un petit gestionnaire de bouton est acceptable au début, mais une fois les flux s'étendent sur plusieurs écrans et actions asynchrones, les appels d'avertissement dispersés partout deviennent difficiles à raisoner..

C'est pourquoi les équipes standardisent souvent les modèles de UX entourant les avertissements tôt, de la même manière qu'elles standardisent le comportement de l'écran de démarrage dans les applications React Native

Les bonnes utilisations d'un avertissement simple sont Why Alert fonctionne
Confirmation de sauvegarde après un changement de paramètres critique Le utilisateur a besoin d'une reconnaissance explicite
Avertissement de déconnexion de session Le message est urgent et orienté vers une action
Avertissement de fonctionnalité non prise en charge L'application doit s'arrêter et expliquer

Si vous avez besoin que l'utilisateur choisisse entre des chemins, le prochain pas est l' buttons array. C'est là que Alert.alert() devient plus qu'une simple boîte de message.

Gestion de l'entrée utilisateur avec boutons de confirmation

La plupart des utilisations réelles d'alerte ne sont pas des informations. C'est une décision. Supprimer le brouillon, annuler les modifications, se déconnecter, réessayer une requête échouée. C'est là que buttons array compte.

Voici un dialogue de confirmation courant :

import React from 'react';
import { View, Button, Alert } from 'react-native';

export default function DangerZone() {
  const confirmDelete = () => {
    Alert.alert(
      'Delete item',
      'This action cannot be undone.',
      [
        {
          text: 'Cancel',
          style: 'cancel',
        },
        {
          text: 'Delete',
          style: 'destructive',
          onPress: () => {
            console.log('Deleting item...');
          },
        },
      ]
    );
  };

  return (
    <View style={{ padding: 24 }}>
      <Button title="Delete item" onPress={confirmDelete} />
    </View>
  );
}

Une personne appuyant sur un bouton rouge et un bouton vert sur un tableau de commande en bois.

Chaque bouton est un objet. Dans la pratique, vous utiliserez trois propriétés le plus souvent :

  • text est le libellé affiché à l'utilisateur.
  • onPress s'exécute lorsque ce bouton est tapé.
  • style communiquera un sens, en particulier sur iOS.

Le choix des libellés de bouton pour réduire les erreurs

Le API vous permet d'écrire « OK » et de passer à autre chose. C'est généralement insuffisant. Le libellé doit décrire la conséquence, surtout pour les actions destructrices.

Comparez ces deux ensembles :

  • Les libellés faibles: OK / Annuler
  • Étiquettes meilleures: Supprimer l'élément / Garder l'élément

La deuxième version supprime l'ambiguïté. Cela compte dans les flux destructeurs, et cela compte encore plus lorsque l'alerte apparaît après une erreur ou une opération asynchrone. Le texte du bouton devrait répondre, « Qu'est-ce qui se passe si je clique dessus ? »

Si votre flux collecte du texte de l'utilisateur ailleurs, un modèle de compagnon propre est de pairer les alertes avec des entrées de formulaire explicites telles qu'une entrée dédiée Implémentation de TextInput React Native au lieu d'essayer de surétendre le dialogue.

Quels styles de boutons signifient vraiment

Le style champ est sémantique, et non décoratif. Utilisez-le pour communiquer votre intention.

Style Lorsque l'utiliser Remarques
default Actions normales Bon pour des choix neutres
cancel Sortir ou reculer Important pour un rejet sûr
destructive Action irréversible Mis en évidence visuellement sur iOS

Selon les notes de Gluestack sur les benchmarks techniques, les conventions de la plateforme sont importantes ici. iOS place le annuler bouton à gauche et confirmer à droite, tandis que Android inverse cela. Violer ces conventions fait grimper les indicateurs de confusion des utilisateurs de 25% dans les marchés mondiaux, et 45% Les notifications critiques de l'application en production manquent souvent d'une voie de sortie obligatoire ou d'une option d'annulation, ce qui augmente les actions irréversibles et le volume de soutien. Cette même analyse note également que les implémentations de notification personnalisées échouent souvent dans l'ordre de lecture pour les technologies d'assistance. Consultez le guide de notification Gluestack pour plus d'informations. Guide de notification Gluestack.

Règle pratique : chaque notification destructive doit inclure une façon explicite de sortir.

Pour une démonstration visuelle plus approfondie de la configuration des boutons et du flux d'interaction, ce court démo est à voir.

Un modèle de confirmation plus sûr

Lorsque l'action est sensible, gardez l'appel en retour mince :

Alert.alert(
  'Sign out',
  'You will need to log in again to continue.',
  [
    { text: 'Stay signed in', style: 'cancel' },
    {
      text: 'Sign out',
      style: 'destructive',
      onPress: async () => {
        try {
          await signOut();
        } catch (error) {
          Alert.alert('Sign out failed', 'Please try again.');
        }
      },
    },
  ]
);

Ce modèle est ennuyant, et c'est pourquoi il est bon. Les notifications doivent rester prévisibles.

Un bug de production courant ressemble à ceci. Le même appel fonctionne sur iOS, fonctionne sur Android, puis échoue à fonctionner une fois que l'équipe expédie une mise à jour web. Le __CAPGO_KEEP_0__ ressemble uniformément à __CAPGO_KEEP_1__, mais les plateformes ne sont pas. Alert.alert() call works on iOS, works on Android, then fails to function once the team ships a web build. The API looks uniform in code, but the platforms are not.

__CAPGO_KEEP_0__

iOS et Android ne correspondent pas parfaitement

L'ordre des boutons est le premier endroit où les équipes se font piéger. React Native délègue les alertes au système d'exploitation, donc les utilisateurs voient des conventions natives, pas une abstraction React Native. C'est généralement le bon compromis, mais cela signifie que les étiquettes des boutons doivent rester univoques sur les plateformes.

Le support des invites est le plus grand décalage. iOS prend en charge Alert.prompt pour une saisie de texte légère. Android ne le fait pas. Si un flux dépend de l'entrée d'un mot de passe, de la renommage d'un élément ou de la capture d'une note courte à l'intérieur de l'invite elle-même, ce flux est iOS uniquement à moins que vous ne construisez une voie séparée.

Utilisez une vérification de plateforme tôt au lieu de prétendre que les API s'alignent.

import { Alert, Platform } from 'react-native';

export function requestPassword() {
  if (Platform.OS === 'ios') {
    Alert.prompt(
      'Enter password',
      'Please confirm your password.',
      [
        { text: 'Cancel', style: 'cancel' },
        {
          text: 'Continue',
          onPress: (value) => {
            console.log('Password entered:', value);
          },
        },
      ],
      'secure-text'
    );
    return;
  }

  Alert.alert(
    'Confirmation required',
    'Please continue to the next screen to confirm this action.',
    [{ text: 'OK' }]
  );
}

Cette solution Android est moins pratique. C'est toujours la meilleure option. En production, une redirection vers une page dédiée ou une modal contrôlée est plus facile à tester, plus facile à localiser et plus facile à rendre accessible qu'une invite fausse construite autour d'un comportement non pris en charge.

Le support Web nécessite son propre plan

La documentation officielle d'Alert de React Native API liste le support pour iOS et Android dans le Référence d'Alert de React Native. Si votre application fonctionne également sur React Native Web ou Expo Web, laisser les alertes non enveloppées crée une failure complète pour cette voie d'interaction sur les builds web (Discussion sur le support de l'alerte dans React Native Web).

C'est pas un cas d'extrême niche. Les équipes le découvrent souvent tard parce que la couverture QA mobile passe en premier, tandis que la couverture navigateur arrive plus tard.

Traitez les alertes natives comme mobiles sauf si vous ajoutez un conteneur.

Ce conteneur aide également si votre équipe compare les compromis de runtime hybride entre les plateformes, en particulier dans une comparaison d'architecture React Native vs. __CAPGO_KEEP_0__ React Native vs. Capacitor architecture comparison.

Pour de nombreuses applications, la première solution de rechange fonctionnelle est une petite abstraction autour de la séparation de plateforme :

Ce modèle résout l'écart de support immédiat, mais il a des limites.

import { Alert, Platform } from 'react-native';

type ConfirmOptions = {
  title: string;
  message?: string;
  onConfirm?: () => void;
  onCancel?: () => void;
};

export function confirmDialog({
  title,
  message,
  onConfirm,
  onCancel,
}: ConfirmOptions) {
  if (Platform.OS === 'web') {
    const result = window.confirm(message ? `${title}\n\n${message}` : title);
    if (result) onConfirm?.();
    else onCancel?.();
    return;
  }

  Alert.alert(title, message, [
    { text: 'Cancel', style: 'cancel', onPress: onCancel },
    { text: 'OK', onPress: onConfirm },
  ]);
}

Cela vous donne presque aucun contrôle sur la mise en forme, le comportement de focus ou les hooks d'analytique. Il s'agit d'un filet de sécurité raisonnable pour les confirmations simples, pas une réponse finale pour les flux qui nécessitent une revue d'accèsibilité, une file d'attente d'alerte ou un comportement cohérent entre mobile et web. window.confirm Quand utiliser un Modale personnalisé au lieu d'une alerte

Les dialogues d'alerte natives sont puissants parce qu'ils sont limités. Cette même limitation est pourquoi ils cesseront rapidement d'être la bonne solution.

Si vous avez besoin de

marquage, contrôle de disposition, icônes, champs de formulaire, espacement personnalisé, temps d'animation ou cohérence visuelle entre les plateformes Arrêtez de lutter contre __CAPGO_KEEP_0__. Utilisez un modale personnalisé., stop fighting the API. Use a custom modal.

A un cadenas en laiton posé à côté d'un mécanisme de roue dentée complexe en métal sur une surface blanche.

Les alertes natives vous empêchent de code autour.

Vous ne pouvez pas faire Alert.alert() resembler à votre système de conception. C'est par design. React Native remet la gestion de la rendu à l'OS, vous héritez donc d'une apparence native et des contraintes natives.

C'est bien quand vous voulez une confirmation rapide. C'est mal quand le produit demande l'un de ces éléments :

  • Un dialogue de confirmation personnalisé avec logo, texte d'aide et hiérarchie personnalisée
  • Un formulaire à plusieurs champs à l'intérieur du modale
  • Un flux destructeur plus riche avec reconnaissance de case à cocher
  • Une demande de note ou de demande de commentaire Avec des étoiles, illustration et boutons personnalisés

Une fois que ces exigences apparaissent, l'alerte native devient un cul-de-sac.

Un filtre de décision simple

Utiliser Alerte Native React lorsque le dialogue est :

Utiliser l'alerte native Utiliser un modale personnalisé
Message court Contenu riche ou structuré
Une à trois actions de base Champs de formulaire ou composants intégrés
Un aspect natif est acceptable La cohérence visuelle est importante sur toutes les plateformes
Vous voulez une mise en œuvre la plus rapide possible Vous avez besoin de contrôle sur la disposition et les animations

Un modale personnalisé est également utile lorsque vos builds mobiles et web ont besoin du même comportement. Au lieu de caser chaque plateforme à vie, vous pouvez centraliser un composant de dialogue et conserver votre modèle d'interaction cohérent.

Le moment où vous commencez à souhaiter que Alert ait "juste une autre propriété", vous avez probablement besoin d'un modale.

Les candidats idéaux pour les bibliothèques de modales personnalisées

Le composant intégré fonctionne, mais de nombreux équipes choisissent un wrapper comme "" car il ajoute des contrôles pratiques autour de la visibilité, du comportement de fond et de l'animation. Modal C'est particulièrement utile pour les flux qui ressemblent à des feuilles d'action, des tiroirs inférieurs ou des panneaux de confirmation composés. Si votre conception se situe plus près d'un menu qu'un alerte native stricte, des modèles d'interface liés comme un feuille d'action Ionic react-native-modal Un modale personnalisé est également utile lorsque vos builds mobiles et web ont besoin du même comportement. Au lieu de caser chaque plateforme à vie, vous pouvez centraliser un composant de dialogue et conserver votre modèle d'interaction cohérent.

Le moment où vous commencez à souhaiter que Alert ait "juste une autre propriété", vous avez probablement besoin d'un modale. Le composant intégré fonctionne, mais de nombreux équipes choisissent un wrapper comme "" car il ajoute des contrôles pratiques autour de la visibilité, du comportement de fond et de l'animation. fournissent souvent un modèle mental plus clair que l'effort de faire plier Alert en forme.

Un avertissement compte ici. Ne remplacez pas chaque alerte par un modale personnalisé juste parce qu'il ressemble mieux. Les alertes natives gagnent encore en vitesse, en familiarité et en faible risque d'implémentation. Utilisez un modale parce que l'interaction le nécessite, et non parce que l'équipe de design déteste le chrome système.

Modèles de production pour des alertes fiables React Native

Une demande de suppression échoue, le gestionnaire de réessai déclenche, et la vérification de session-expirée s'exécute au même moment. Sans une stratégie d'alerte claire, les utilisateurs peuvent être frappés par des dialogues superposés, une perte de focus ou un no-op sur le web parce que Alert.alert n'est pas implémenté là-bas. Ces bogues proviennent généralement de l'architecture, et non de l'appel API lui-même.

Centralisez les alertes au lieu d'appeler partout

Direct Alert.alert(...) les appels dispersés sur les écrans ne tiennent pas la route dans un codebase plus grand. Un composant gère une erreur API, un autre demande une confirmation de navigation, et un troisième avertit sur l'expiration de l'authentification. Si ces événements se produisent à proximité les uns des autres, vous avez besoin d'ordre, de déduplication et de logique de fallback de plateforme dans un seul endroit.

Un service d'alerte global résout cela. Utilisez Redux, Zustand ou React Context. Le choix de la boutique compte moins que le contrat. Les demandes d'alerte entrent dans une file d'attente, un dialogue est actif à la fois, et le web peut passer à un fallback basé sur des modales derrière la même interface.

Les développeurs discutant des modèles d'abstraction d'alerte ont souligné à plusieurs reprises le même mode de failure : les applications mal structurées finissent souvent par avoir des dialogues empilés qui piégent les utilisateurs ou cachent l'action qu'ils doivent prendre, parfois affectant environ 30-40% des implémentations discutées en pratique (la discussion sur l'implémentation d'abstraction d'alerte et de dialogue empilé a été notée plus tôt dans l'article, il ne faut donc pas répéter le lien ici). La solution pratique est simple. Enveloppez le __CAPGO_KEEP_0__ une fois, filez les requêtes globalement, et faites en sorte que le rendu soit responsable d'un seul alerte visible. was noted earlier in the article, so do not repeat that link here). The practical fix is simple. Wrap the API once, queue requests globally, and make the renderer responsible for exactly one visible alert.

La couche UI s'abonne à l'élément de file d'attente initial et rend exactement un dialogue. Lorsque l'utilisateur le ferme, le service supprime cet élément et révèle le suivant.

type AlertRequest = {
  title: string;
  message?: string;
  buttons?: { text: string; onPress?: () => void; style?: 'default' | 'cancel' | 'destructive' }[];
};

type AlertStore = {
  queue: AlertRequest[];
  push: (alert: AlertRequest) => void;
  shift: () => void;
};

La accessibilité fait partie de l'implémentation

Les alertes natives vous donnent des valeurs par défaut decentes sur iOS et Android. Le moment où vous introduisez un fallback personnalisé pour le web, un contenu plus riche, ou la remplacement de la boîte de dialogue Android, vous prenez en charge le comportement que la boîte de dialogue système gère gratuitement.

La comparaison de Gluestack des options d'alerte de React Native note que les implémentations de modales personnalisées cassent souvent l'ordre de lecture attendu de

title → message → buttons , avec des échecs signalés autourde ce domaine dans leur benchmark de gestion de l'accessibilité (la comparaison d'accessibilité des alertes et modales de React Native de Gluestack). Cette question spécifique compte parce que les utilisateurs de lecteurs d'écran s'appuient sur une structure prévisible pour comprendre le dialogue avant d'y agir. 60% of implementations discussed in practice (

Pour un affichage d'alerte personnalisé, gardez cette liste de vérification courte et contraignante :

  • Déplacer le focus dans le dialogue lorsqu'il s'ouvre.
  • Renvoyer le focus sur le déclencheur après la fermeture.
  • Conserver l'ordre de lecture intact : titre, message, puis actions.
  • Fournir un chemin de cancel clairen particulier pour les flux destructeurs.
  • Étiqueter les actions avec précision. « Supprimer » est mieux que « OK » lorsque la conséquence compte.

Les bogues d'accessibilité dans les flux d'alerte sont faciles à manquer pendant la QA normale. Les utilisateurs de clavier et les utilisateurs de lecteurs d'écran les trouvent en premier.

Testez le déclencheur, pas la plateforme de dialogue

Les tests unitaires devraient vérifier que votre code a demandé le avertissement que vous attendiez. Ils ne devraient pas dépendre du runtime de dialogue natif.

Un modèle de Jest courant ressemble à ceci :

import { Alert } from 'react-native';

jest.spyOn(Alert, 'alert').mockImplementation(() => {});

it('asks for confirmation before deleting', () => {
  triggerDeleteFlow();

  expect(Alert.alert).toHaveBeenCalledWith(
    'Delete item',
    'This action cannot be undone.',
    expect.any(Array)
  );
});

Cela garde les tests centrés sur la logique métier et empêche les blocages causés par le comportement de dialogue en dehors de l'environnement de test. Cela pousse également les équipes vers un wrapper API, qui est utile une fois que les limitations des invites web et Android forcent un fallback personnalisé.

Le suivi client aide ici aussi. Les équipes qui suivent déjà les échecs d'interaction avec Sentry dans les applications React Native attrapent généralement plus d'issues liées aux avertissements lorsque les chemins déclenchant les avertissements code sont encapsulés dans une gestion d'erreurs explicite et loggés avec suffisamment de contexte pour reproduire la flèche.

Un seuil de production qui tient

Pour les applications au-delà de la phase de prototype, utilisez un petit ensemble de règles :

  1. Enveloppez Alert.alert dans un assistant pour que la logique de fallback web vive dans un seul endroit.
  2. Gérer les requêtes de dialogue en file d'attente à l'échelle mondiale Ainsi, seul un avertissement est visible à un moment donné.
  3. Considérer le support de la prompt Android comme manquant et prévoir un fallback modal au lieu de brancher tardivement.
  4. Exiger des actions d'annulation pour les opérations destructrices ou irréversibles.
  5. Simuler les avertissements dans les tests et vérifier les étiquettes, les appels de rappel et l'ordre.
  6. Utiliser un modal personnalisé uniquement lorsque nécessairecomme la parité web, l'entrée de prompt ou un contenu plus riche.

Cela garde les avertissements natifs rapides là où ils fonctionnent bien et évite de peindre le codebase dans un coin lorsque les différences de plateforme apparaissent plus tard.

Mises à jour en direct pour les applications Capacitor

Lorsqu'un bug de la couche web est en ligne, expédiez la correction par Capgo au lieu d'attendre des jours pour l'approbation de l'app store. Les utilisateurs reçoivent la mise à jour en arrière-plan tandis que les changements natifs restent dans la voie de revue normale.

Commencez dès maintenant

Dernières actualités de notre Blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.