Anda mengaktifkan Alert.alert() dalam React Native, tes di iPhone dan Android, dan merasa sudah selesai. Kemudian seseorang membuka build web dan tidak ada yang muncul. Atau Android mengabaikan alur konfirmasi yang Anda gunakan di iOS. Atau dua bagian aplikasi memicu peringatan sekaligus dan pengguna terjebak dalam tumpukan dialog yang berantakan.
That’s the shape of the React Native Alert API. It’s great for fast, native confirmation flows. It’s also narrow, platform-bound, and easy to misuse in production. The good news is that the happy path is simple, and the rough edges are predictable once you know where they are.
Daftar Isi
- Menggunakan Alert.alert untuk Menampilkan Pesan Sederhana
- Mengelola Input Pengguna dengan Tombol Konfirmasi
- Mengatasi Kekacauan Platform dan Prompt Input
- Menggunakan Modal Kustom Daripada Peringatan
- Polanya Produksi untuk Peringatan React Native yang Terpercaya
Menggunakan Peringatan.alert untuk Menampilkan Pesan Sederhana
Untuk notifikasi UI dasar, React Native Alert masih merupakan alat tercepat di box. Anda mengimport Alert, panggil Alert.alert(), dan platform menampilkan dialog asli. Tidak ada dependensi tambahan, tidak ada modifikasi status, tidak ada pekerjaan gaya.
The simplest version hanya memerlukan judul dan pesan:
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>
);
}

Polanya berfungsi baik ketika pengguna tidak perlu membuat pilihan yang bermakna. Pikirkan “pengaturan disimpan”, “sesi habis”, atau “fitur tidak tersedia saat ini”. Dialog mengganggu aliran, jadi harus membawa informasi yang pengguna butuh sekarang, bukan kebisingan status kecil.
Apa yang panggilan dasar memberikan Anda
A plain Alert.alert(title, message) berguna karena tetap asli. Sistem operasi mengelola presentasi visual, peran tombol, dan pola interaksi standar. Untuk banyak tim, itu adalah perdagangan yang tepat.
Beberapa aturan praktis membantu menjaga itu berguna:
- Pakai judul langsung“Gagal mengunggah” lebih jelas daripada “Peringatan”.
- Jaga pesan singkat.Alerts adalah untuk konteks segera, bukan penjelasan panjang.
- Simpan alert untuk informasi penghalang.Jika pengguna dapat melanjutkan tanpa gangguan, toast seringkali lebih baik.
Jaga alert kecil dan tegas. Jika pengguna perlu membaca paragraf, dialog mungkin tidak UI yang tepat.
Di mana tim salah gunakan
Kebiasaan salah yang paling umum adalah menggunakan alert sebagai sistem pesan umum. Jika setiap aksi sukses menampilkan dialog penghalang, aplikasi mulai terasa berat cepat. Alert native paling kuat ketika menghentikan pengguna untuk alasan tertentu.
Salah lainnya adalah mengkaitkan alert terlalu erat dengan komponen internal. Sebuah handler tombol kecil baik-baik saja pada awalnya, tetapi ketika aliran mengalir ke beberapa layar dan aksi asinkron, panggilan alert yang tercecer di mana-mana sulit untuk dipahami. Itulah mengapa tim sering mengstandarikan pola UX sekitar awal, sama seperti mereka mengstandarikan perilaku layar awal di aplikasi React Native Penggunaan yang baik untuk alert sederhana.
Skenario
| Scenario | Mengapa Alert Berfungsi |
|---|---|
| Simpan Konfirmasi Setelah Perubahan Pengaturan Kritis | Pengguna Memerlukan Pengakuan yang Jelas |
| Pemberhentian Sesi Peringatan | Pesan Ini Urgent dan Berorientasi Tindakan |
| Pemberitahuan Fitur yang Tidak Dapat Dibantu | Aplikasi Perlu Berhenti dan Menguraikan |
Jika Anda Perlu Membuat Pengguna Memilih Antara Jalur, Langkah Selanjutnya Adalah buttons Array. Di Sana Alert.alert() Mengubah Pengguna Menjadi Pengguna yang Lebih Baik
Mengelola Masukan Pengguna dengan Tombol Konfirmasi
Penggunaan Alert yang Nyata Paling Banyak Tidak Berisi Informasi. Itu Tentang Keputusan. Hapus Rancangan, Diskusikan Perubahan, Keluar, Ulangi Permintaan yang Gagal. Di Sana buttons array sangat penting.
Berikut adalah dialog konfirmasi yang umum:
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>
);
}

Setiap tombol adalah objek. Dalam prakteknya, Anda akan menggunakan tiga properti paling sering:
textadalah label yang ditampilkan kepada pengguna.onPressberjalan ketika tombol tersebut ditekan.styleberkomunikasi makna, terutama pada iOS.
Pemilihan label tombol yang mengurangi kesalahan
API memungkinkan Anda menulis 'OK' dan melanjutkan. Itu biasanya tidak cukup. Label harus menjelaskan hasil, terutama untuk aksi destructive.
Bandingkan dua set berikut:
- Label lemah: OK / Cancel
- Label yang lebih baik: Hapus item / Simpan item
Versi kedua menghilangkan ketidakjelasan. Hal ini sangat penting dalam aliran yang menghancurkan, dan hal ini bahkan lebih penting ketika peringatan muncul setelah terjadi kesalahan atau operasi asinkron. Tekst button harus menjawab, “Apa yang terjadi jika saya mengetuk ini?”
Jika aliran Anda mengumpulkan teks dari pengguna di tempat lain, pola teman yang bersih adalah memasangkan peringatan dengan input formulir eksplisit seperti implementasi TextInput React Native yang khusus sebaliknya dari mencoba meluaskan dialog. Apa yang dimaksudkan oleh gaya tombol yang sebenarnya
What button styles actually mean
Field ini bersifat semantik, bukan dekoratif. Gunakan untuk menyampaikan niat. style Gaya
| Kapan menggunakan | Catatan | Catatan |
|---|---|---|
default |
Aksi normal | Baik untuk pilihan netral |
cancel |
Keluar atau keluar | Penting untuk penghapusan aman |
destructive |
Tindakan tidak dapat dikembalikan | Ditandai visual pada iOS |
Catatan Gluestack tentang benchmark teknis menunjukkan bahwa konvensi platform sangat penting di sini. iOS menempatkan tombol batal pada sisi kiri dan konfirmasi pada sisi kanan, sementara Android mengubahnya. Melanggar konvensi-konvensi tersebut menyebabkan indikator kebingungan pengguna meningkat dengan 25% di pasar global, dan 45% Produksi aplikasi yang kurang memiliki jalur pembatalan atau keluar yang wajib, meningkatkan aksi yang tidak dapat dibatalkan dan volume dukungan. Analisis yang sama juga menyebutkan bahwa implementasi peringatan kustom sering gagal dalam membaca urutan untuk teknologi bantu. Petunjuk Peringatan Gluestack.
Aturan Praktis: Setiap peringatan yang merusak harus memiliki cara keluar yang eksplisit.
Untuk walkthrough visual yang lebih baik tentang konfigurasi tombol dan alur interaksi, demo singkat ini patut dilihat.
Polanya Konfirmasi yang Lebih Aman
Ketika aksi yang sensitif, jaga callback tipis:
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.');
}
},
},
]
);
Polanya itu membosankan, dan itu mengapa itu baik. Peringatan harus tetap prediktif.
Mengarungi Kekacauan Platform dan Prompt Input
Bug produksi yang umum terlihat seperti ini. Sama-sama Alert.alert() Panggilan yang sama bekerja di iOS, bekerja di Android, kemudian gagal berfungsi setelah tim mengirimkan build web. API tampak seragam di code, tetapi platform tidak.

iOS dan Android tidak sepenuhnya sesuai.
Urutan tombol adalah tempat tim pertama kali terjebak. React Native mengirimkan peringatan ke sistem operasi, sehingga pengguna melihat konvensi asli, bukan abstraksi React Native. Itu biasanya adalah tawaran yang tepat, tetapi itu berarti label tombol harus tetap tidak ambigu di antara platform.
Support prompt adalah kesesuaian yang lebih besar. iOS mendukung Alert.prompt untuk entri teks ringan. Android tidak. Jika suatu alur bergantung pada memasukkan kata sandi, mengubah nama item, atau menangkap catatan singkat di dalam peringatan itu sendiri, maka alur itu hanya tersedia di iOS kecuali Anda membangun jalur terpisah.
Gunakan periksa platform awal daripada berpura-pura bahwa API berada di garis lurus.
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' }]
);
}
Alternatif Android itu kurang nyaman. Namun, itu masih pilihan yang lebih aman. Di produksi, arahan ke layar dedikasi atau modal yang dikendalikan lebih mudah untuk diuji, lebih mudah untuk disesuaikan dengan bahasa, dan lebih mudah untuk membuat aksesibel daripada peringatan palsu yang dibangun di sekitar perilaku yang tidak didukung.
Web membutuhkan rencana sendiri.
Dokumentasi resmi Alert React Native API menyebutkan dukungan untuk iOS dan Android di Referensi Alert React Native.. Jika aplikasi Anda juga berjalan di React Native Web atau Expo Web, meninggalkan peringatan tidak dibungkus akan menciptakan kegagalan total untuk jalur interaksi di build browser ('Pembahasan masalah React Native Web pada dukungan peringatan).
. Itu bukan kasus pinggiran. Tim sering menemukannya terlambat karena QA mobile melewati terlebih dahulu, sementara penutupan browser datang kemudian.
Gunakan Alert native sebagai hanya mobile kecuali Anda menambahkan wrapper.
Wrapper tersebut juga membantu jika tim Anda sedang membandingkan kelebihan runtime hybrid di antara platform, terutama dalam perbandingan arsitektur React Native vs. __CAPGO_KEEP_0__ React Native vs. Capacitor architecture comparison.
Untuk banyak aplikasi, solusi kerja yang paling sederhana adalah abstraksi kecil di sekitar pemisahan platform:
Polifill ini menyelesaikan celah dukungan yang segera, tetapi memiliki batasan.
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 },
]);
}
Memberikan Anda kendali yang sangat sedikit atas gaya, perilaku fokus, atau hook analisis. Ini adalah jaringan keselamatan yang wajar untuk konfirmasi sederhana, bukan jawaban akhir untuk alur yang memerlukan tinjauan aksesibilitas, antrian peringatan, atau perilaku konsisten di antara mobile dan web. window.confirm Kapan Menggunakan Modal Kustom Sebaliknya Alert
Dialog peringatan native kuat karena terbatas. Batasan yang sama adalah mengapa mereka berhenti menjadi alat yang tepat dengan cepat.
Jika Anda memerlukan
branding, kendali tata letak, ikon, bidang formulir, jarak kustom, pengaturan waktu animasi, atau konsistensi visual lintas platform , berhenti melawan __CAPGO_KEEP_0__. Gunakan modal kustom., stop fighting the API. Use a custom modal.

Native alert limits you can’t code around
Tidak ada cara untuk membuat Alert.alert() terlihat seperti sistem desain Anda. Itu adalah desain. React Native menyerahkan rendering ke sistem operasi, sehingga Anda mewarisi penampilan native dan konstrain native.
Itu baik ketika Anda ingin konfirmasi cepat. Itu buruk ketika produk meminta salah satu hal ini:
- Konfirmasi dialog yang ditandai dengan logo, teks bantuan, dan hierarki kustom Form multi-kolom
- di dalam modal Alur penghapusan yang lebih kaya
- dengan pengakuan centang Pertanyaan rating atau permintaan ulasan
- __CAPGO_KEEP_0__ dengan bintang, ilustrasi, dan tombol kustom
Setelah persyaratan tersebut muncul, peringatan asli menjadi ujung tanduk.
Aplikasi filter sederhana
Pilih Peringatan React Native ketika dialog adalah:
| Pilih Peringatan Asli | Pilih Modal Kustom |
|---|---|
| Pesan singkat | Isi yang lebih kompleks atau terstruktur |
| Satu hingga tiga aksi dasar | Formulir atau komponen terintegrasi |
| Penampilan native platform diterima | Mengenai konsistensi visual di semua platform |
| Anda ingin implementasi yang paling cepat | Anda membutuhkan kontrol layout dan animasi |
Dialog kustom juga membantu ketika build mobile dan web Anda memerlukan perilaku yang sama. Sebaliknya dari kasus spesial masing-masing platform selamanya, Anda dapat mengkoordinasikan satu komponen dialog dan menjaga model interaksi yang konsisten.
Ketika Anda mulai berharap Alert memiliki ‘satu lagi properti,’ Anda mungkin membutuhkan dialog kustom.
Kandidat yang baik untuk perpustakaan dialog kustom
Komponen bawaan Modal Komponen ini berfungsi, tetapi banyak tim memilih wrapper seperti react-native-modal Karena itu menambahkan kontrol yang praktis di sekitar visibilitas, perilaku latar belakang, dan animasi.
Terutama berguna untuk alur yang menyerupai kartu aksi, laci bawah, atau panel konfirmasi yang terdiri dari beberapa bagian. Jika desain Anda lebih dekat dengan menu daripada peringatan native yang ketat, pola UI terkait seperti Sheet aksi Ionic seringnya memberikan model mental yang lebih baik daripada mencoba memanipulasi Alert menjadi bentuk yang diinginkan.
Peringatan satu hal yang perlu diingat. Jangan mengganti setiap peringatan dengan modal kustom hanya karena tampilannya lebih menarik. Peringatan asli masih menang dalam hal kecepatan, kebiasaan, dan risiko implementasi yang rendah. Gunakan modal karena interaksi memerlukan, bukan karena tim desain tidak menyukai chrome sistem.
Polanya Produksi untuk Peringatan React Native yang Terpercaya
Permintaan hapus gagal, handler ulang gagal, dan periksa sesi yang berakhir pada waktu yang sama. Tanpa strategi peringatan yang jelas, pengguna dapat terkena dialog yang berlapis, fokus yang hilang, atau tidak berfungsi pada web karena Alert.alert tidak diimplementasikan di sana. Bug biasanya berasal dari arsitektur, bukan dari API itu sendiri.
Sentralkan peringatan daripada memanggilnya di mana-mana
Langsung Alert.alert(...) panggilan yang terpencar di layar tidak dapat bertahan dalam kodebase yang lebih besar. Komponen satu menangani gagal API, komponen lain meminta konfirmasi navigasi, dan komponen ketiga memberi peringatan tentang kadaluarsa autentikasi. Jika kejadian itu terjadi bersamaan, Anda memerlukan logika pengaturan, penghapusan duplikat, dan fallback platform di satu tempat.
Jasa peringatan global menyelesaikan masalah itu. Gunakan Redux, Zustand, atau React Context. Pilihan penyimpanan tidak terlalu penting daripada kontrak. Permintaan peringatan masuk ke dalam antrian, satu dialog aktif pada satu waktu, dan web dapat menukar ke fallback berbasis modal di balik interface yang sama.
Para pengembang yang membahas pola abstraksi peringatan telah menunjukkan mode gagal yang sama secara berulang-ulang: aplikasi yang terstruktur buruk sering kali berakhir dengan dialog yang berlapis-lapis yang menangkap pengguna atau menyembunyikan aksi yang mereka butuhkan, kadang-kadang mempengaruhi sekitar 30-40% di antara implementasi yang dibahas dalam praktek (diskusi implementasi tentang abstraksi peringatan dan stacking dialog telah disebutkan sebelumnya dalam artikel ini, jadi jangan ulangi tautan itu di sini). Solusi praktisnya sederhana. Tutup __CAPGO_KEEP_0__ sekali, antrikan permintaan secara global, dan buat renderer bertanggung jawab atas satu peringatan yang terlihat secara tepat. 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.
Lapisan UI berlangganan item antrian pertama dan menampilkan dialog yang tepat. Ketika pengguna menutupnya, layanan menghapus item itu dan menampilkan yang berikutnya.
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;
};
Kemampuan aksesibilitas merupakan bagian dari implementasi
Peringatan asli memberikan Anda default yang memadai pada iOS dan Android. Saat Anda memperkenalkan fallback kustom untuk web, konten yang lebih kaya, atau pengganti prompt Android, Anda mengambil alih perilaku yang dialog sistem tangani secara gratis.
Pengadilan Gluestack tentang pilihan peringatan React Native mencatat bahwa implementasi modal kustom sering kali menghancurkan urutan membaca yang diharapkan dari
title → pesan → tombol , dengan kegagalan yang dilaporkan sekitardi bidang tersebut dalam benchmark mereka tentang penanganan aksesibilitas (Pengadilan Gluestack tentang Aksesibilitas Peringatan React Native vs Modal). Masalah itu penting karena pengguna pembaca layar bergantung pada struktur yang dapat diprediksi untuk memahami dialog sebelum bertindak atasnya. 60% in that area in their benchmark of accessibility handling (Gluestack’s React Native Alert vs Modal accessibility comparison). That specific issue matters because screen reader users rely on predictable structure to understand the dialog before acting on it.
Untuk antarmuka peringatan kustom, jaga daftar checklist singkat dan ketat:
- Pindahkan fokus ke dialog ketika itu dibuka.
- Kembalikan fokus ke trigger setelah penolakan.
- Tahan urutan membaca utuh: judul, pesan, kemudian aksi.
- Berikan jalur batal yang jelas, terutama untuk aliran destruktif.
- Label aksi dengan tepat. “Hapus” lebih baik daripada “OK” ketika konsekuensi penting.
Bug aksesibilitas dalam aliran peringatan mudah terlewatkan selama QA normal. Pengguna papan tik dan pengguna pembaca layar menemukannya terlebih dahulu.
Uji trigger, bukan dialog platform
Uji unit harus memastikan bahwa code Anda meminta peringatan yang Anda harapkan. Mereka tidak boleh bergantung pada runtime dialog native.
Polanya Jest yang umum seperti ini:
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)
);
});
Yang menjaga uji fokus pada logika bisnis dan mencegah henti yang disebabkan oleh perilaku dialog di luar lingkungan uji. Ini juga mendorong tim ke wrapper API, yang berguna ketika kekurangan prompt web dan Android memaksa fallback kustom.
Pemantauan sisi klien membantu di sini juga. Tim yang sudah mengikuti gagal interaksi dengan Sentry di aplikasi React Native biasanya menangkap lebih banyak masalah peringatan ketika jalur code yang memicu peringatan diapit dengan penanganan kesalahan eksplisit dan dicatat dengan cukup konteks untuk mengulangi aliran.
Dasar produksi yang berdiri
Untuk aplikasi yang sudah melewati tahap prototipe, gunakan set kecil aturan:
- Terapkan
Alert.alertdi helper sehingga logika fallback web hidup di satu tempat. - Diajukan permintaan dialog secara global Hanya satu peringatan yang terlihat pada satu waktu.
- Tangani dukungan prompt Android sebagai hilang Dan rencanakan fallback modal daripada bercabang terlambat.
- Diperlukan aksi pembatalan Untuk operasi merusak atau tidak dapat dikembalikan.
- Mimik peringatan dalam tes Dan asert label, panggilan balik, dan urutan.
- Hanya gunakan modal kustom ketika diperlukanSeperti kesetaraan web, input prompt, atau konten yang lebih kaya.
Ini menjaga peringatan native cepat di mana mereka berfungsi baik dan menghindari melukis kodebase ke sudut ketika perbedaan platform muncul kemudian.