Vous déclenchez Alert.alert() dans React Native, testez sur iPhone et Android, et il 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 désordonné de dialogues.
C'est la forme des alertes React Native API. C'est excellent pour les 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.
Tableau de Contenu
- Afficher des messages simples avec Alert.alert
- Gérer les saisies de l'utilisateur avec les boutons de confirmation
- Naviguer dans les particularités des plateformes et les invitations d'entrée
- Quand utiliser un modale personnalisé au lieu d'un avertissement
- Modèles de production pour des avertissements fiables React Native
Afficher des messages simples avec Alert.alert
Pour une interface de notification de base, Alerte Native React 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.
La version la plus simple n'a besoin que d'un titre et d'un message :
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>
);
}

Cet modèle fonctionne bien lorsque l'utilisateur n'a pas besoin de prendre une décision significative. Pensez à « enregistrements de paramètres », « session expirée » ou « fonctionnalité indisponible pour le moment ». Le dialogue interrompt la progression, il doit donc transmettre les 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
Un plain Alert.alert(title, message) est utile car il reste natif. L'opération système gère la présentation visuelle, les rôles de bouton 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é » est plus clair que « Avertissement ».
- Conservez le message court.Les alertes sont pour un contexte immédiat, pas une explication de longue haleine.
- Réservez les alertes pour des informations bloquantes.Si l'utilisateur peut continuer sans interruption, un toast est souvent un meilleur choix.
Conservez les alertes petites et décisives. Si l'utilisateur doit 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 alertes 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 alertes natives sont les plus fortes lorsqu'elles arrêtent l'utilisateur pour une raison.
Une autre erreur est de coupler les alertes 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'alerte dispersés partout deviennent difficiles à raisonnement. C'est une raison pour laquelle les équipes standardisent souvent les modèles d'expérience utilisateur entourant tôt, de la même manière qu'elles standardisent le comportement de l'écran de démarrage dans les applications React Native.
Bonnes utilisations d'une alerte simple
| Scénario | Pourquoi Alert fonctionne |
|---|---|
| Sauvegarder la confirmation après un changement critique de paramètres | L'utilisateur a besoin d'une reconnaissance explicite |
| Avertissement de déconnexion de session | Le message est urgent et orienté vers une action |
| Avertissement d'une fonctionnalité non prise en charge | L'application a besoin d'arrêter et d'expliquer |
Si vous avez besoin que l'utilisateur choisisse entre des chemins, le prochain pas est le buttons tableau. C'est là que Alert.alert() devient plus qu'une simple boîte de message.
Gestion de l'entrée de l'utilisateur avec des 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 demande échouée. C'est là que buttons array compte.
Ici est 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>
);
}

Chaque bouton est un objet. Dans la pratique, vous utiliserez trois propriétés le plus souvent :
textest l'étiquette affichée à l'utilisateur.onPresss'exécute lorsque ce bouton est tapé.stylecommuniquera le sens, surtout sur iOS.
Choisir des étiquettes de bouton qui réduisent les erreurs
L’API vous permet d'écrire « OK » et de passer à autre chose. C'est généralement insuffisant. L'étiquette doit décrire la conséquence, surtout pour les actions destructrices.
Comparez ces deux ensembles :
- Étiquettes faibles: OK / Annuler
- Étiquettes améliorées: 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'arrive-t-il si je clique sur cela ? »
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 implémentation dédiée de au lieu d'essayer de surétendre le dialogue. Quels styles de boutons signifient vraiment
Le
champ est sémantique, et non décoratif. Utilisez-le pour communiquer votre intention. style Style
| Lorsque l'utiliser | Remarques | field |
|---|---|---|
default |
Actions normales | Bon pour les choix neutres |
cancel |
Sortir ou revenir en arrière | Important pour la mise à l'écart sécurisée |
destructive |
Action irréversible | Mis en évidence visuellement sur iOS |
Selon les notes de Gluestack, les benchmarks techniques montrent que les conventions de la plateforme sont importantes ici. iOS place le bouton de annulation à gauche et le bouton de confirmation à droite, tandis que Android inverse cela. Violer ces conventions fait grimper les indicateurs de confusion des utilisateurs de 25% en marchés mondiaux, et 45% Les alertes critiques dans les applications de production manquent souvent d'une voie de sortie obligatoire ou d'une option de sortie, ce qui augmente les actions irréversibles et le volume de soutien. Cette même analyse souligne également que les implémentations d'alertes personnalisées échouent souvent dans l'ordre de lecture pour les technologies d'assistance. Consultez le guide d'alerte de Gluestack. Le guide d'alerte de Gluestack.
Règle pratique : chaque alerte destructive doit inclure une façon explicite de sortir.
Pour une présentation visuelle plus détaillée de la configuration des boutons et du flux d'interaction, ce démo court est à voir.
Un modèle de confirmation plus sûr
Lorsque l'action est sensible, gardez l'appel à la fonction 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èl’est ennuyant, et c'est pourquoi il est bon. Les alertes doivent rester prévisibles.
Navigation des particularités de plateforme et des invitations de saisie
Un bug de production courant ressemble à ceci. La même Alert.alert() appel fonctionne sur iOS, fonctionne sur Android, puis échoue à fonctionner une fois que l'équipe expédie une mise à jour web. L’API semble uniforme dans code, mais les plateformes ne le sont pas.

iOS et Android ne correspondent pas parfaitement
La disposition 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 invitations 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'alerte 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' }]
);
}
Cet Android de substitution est moins pratique. Il est encore la meilleure option. En production, une redirection vers une page dédiée ou un modèle contrôlé est plus facile à tester, plus facile à localiser et plus facile à rendre accessible qu'une invitation 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 La 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 (La discussion sur le support de l'alerte dans React Native Web).
. Ce n'est pas un cas d'extrémité. Les équipes le découvrent souvent tard parce que la couverture QA mobile passe en premier, tandis que la couverture du navigateur arrive plus tard.
Utilisez l'alerte native comme mobile uniquement à moins que vous n'ajoutiez un wrapper.
Cet enveloppe aide également si votre équipe compare les avantages de l'exécution hybride entre les plateformes, surtout dans une Comparaison d'architecture React Native vs. Capacitor.
Un modèle de polyfill web simple
Pour de nombreuses applications, la première solution fonctionnelle est une petite abstraction autour de la séparation de plateforme :
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 },
]);
}
Cet modèle résout le fossé de support immédiat, mais il a des limites. window.confirm 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 de réponse finale pour les flux nécessitant une revue d'accèsibilité, une file d'attente d'alerte ou un comportement cohérent entre mobile et web.
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 l'outil approprié.
Si vous avez besoin de la personnalisation de la marque, du contrôle de la disposition, des icônes, des champs de formulaire, d'une mise en page personnalisée, d'une animation temporelle ou d'une cohérence visuelle entre les plateformes, arrêtez de lutter contre API. Utilisez un modale personnalisé.

Les alertes natives vous limitent ce que vous pouvez code faire.
Vous ne pouvez pas faire Alert.alert() qu'elles ressemblent à votre système de conception. C'est ainsi conçu. React Native vous fait gérer la rendu à l'opération système, vous hérite donc de l'apparence native et des contraintes natives.
C'est bien quand vous voulez une confirmation rapide. C'est mal quand votre 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
- dans un modèle Un flux destructeur plus riche
- avec une case à cocher d'acknowledgment Une demande de note ou de demande de commentaire
- Une demande de note ou de demande de commentaire Avec des étoiles, illustrations et boutons personnalisés
Une fois que ces exigences apparaissent, l'alerte native devient un cul-de-sac.
Un filtre de décision simple
Utilisez Alerte React Native Lorsque le dialogue est :
| Utilisez l'Alerte native | Utilisez un modal personnalisé |
|---|---|
| Message court | Contenu riche ou structuré |
| Un à trois actions de base | Champs de formulaire ou composants intégrés |
| Un aspect natif de la plateforme est acceptable | La cohérence visuelle est importante entre 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 à l'infini, vous pouvez centraliser un composant de dialogue unique et conserver votre modèle d'interaction cohérent.
Le moment où vous commencez à souhaiter que l'Alerte avait ‘juste une autre propriété’, vous avez probablement besoin d'un modale.
Ces éléments sont de bons candidats pour les bibliothèques de modales personnalisées
Le composant intégré fonctionne, mais beaucoup d'équipes choisissent un wrapper comme Modal car il ajoute des contrôles pratiques autour de la visibilité, du comportement de fond et de l'animation. react-native-modal C'est particulièrement utile pour les flux qui ressemblent à des feuilles d'actions, des tiroirs inférieurs ou des panneaux de confirmation composés. Si votre conception se situe plus près d'un menu qu'un avertissement natif strict, des modèles d'interface tels qu'un
feuille d'action d'Ionic Ionic action sheet offrent souvent un modèle mental plus clair que l'effort de 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 React Native fiables
Une demande de suppression échoue, le gestionnaire de réessais se 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 vaste. Un composant gère une erreur de API, un autre demande la 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% de réalisations discutées en pratique (la discussion sur l'implémentation d'abstraction d'alerte et de dialogue empilé était mentionnée plus tôt dans l'article, il ne faut donc pas répéter le lien ici). La solution pratique est simple. Enveloppez l’API une fois, filez les requêtes globalement, et faites en sorte que le rendu soit responsable d'un seul alerte visible.
Ici est une forme compacte au style Zustand :
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 couche d'interface 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.
L’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 une remplacement de dialogue Android, vous prenez en charge le comportement que le dialogue système gère gratuitement.
La comparaison de Gluestack sur les options d'alerte React Native note que les implémentations de modaux personnalisés brisent souvent l'ordre de lecture attendu de title → message → boutons, avec des échecs signalés autour 60% de ce domaine dans leur benchmark de gestion de l'accessibilité (la comparaison d'accessibilité des alertes et modaux React Native de Gluestack). Cette question spécifique compte car les utilisateurs de lecteurs d'écran s'appuient sur une structure prévisible pour comprendre le dialogue avant d'y agir.
Pour une interface utilisateur d'alerte personnalisée, gardez ce checklist court et contraignant :
- Déplacez le focus dans le dialogue lorsqu'il s'ouvre.
- Renvoyez le focus sur le déclencheur après la fermeture.
- Conserviez l'ordre de lecture intact: titre, message, puis actions.
- Proposez un chemin de cancel clairen particulier pour les flux destructeurs.
- Étiquetez 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 le dialogue de la plateforme
Les tests unitaires devraient vérifier que votre code a demandé l'alerte que vous attendiez. Ils ne doivent pas dépendre de l'exécution du runtime du 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 ralentissements causés par le comportement du 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 redoublement personnalisé.
La surveillance côté 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 alertes lorsque les chemins de déclenchement d'alerte sont enveloppés dans un traitement d'erreur explicite et loggés avec suffisamment de contexte pour reproduire la flèche. usually catch more alert-related issues when alert-triggering code paths are wrapped in explicit error handling and logged with enough context to reproduce the flow.
Pour les applications au-delà de la phase de prototype, utilisez un petit ensemble de règles :
Enveloppez
- dans un assistant
Alert.alertafin que la logique de redoublement web vive dans un seul endroit. __CAPGO_KEEP_0__ est translated as __CAPGO_KEEP_0__ as it is a placeholder and should be kept as is. - Affichez les demandes de dialogue dans la file d'attente globalement de sorte qu'il n'y ait qu'un seul avertissement visible à la fois.
- Gérez le support des invitations Android comme manquant et prévoyez un fallback modal au lieu de faire du branching tardif.
- Exigez des actions d'annulation pour les opérations destructrices ou irréversibles.
- Simulez les avertissements dans les tests et vérifiez les étiquettes, les appels de rappel et l'ordre.
- Utilisez un modal personnalisé uniquement lorsque nécessairecomme la parité web, l'entrée de prompt ou un contenu plus riche.
Cela maintient 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.