Saya ingin aplikasi ReactJS saya memberi tahu pengguna saat keluar dari halaman tertentu. Khususnya pesan popup yang mengingatkan dia untuk melakukan suatu tindakan:
"Perubahan disimpan, tapi belum dipublikasikan. Lakukan sekarang?"
Haruskah saya memicu ini react-router
secara global, atau apakah ini sesuatu yang dapat dilakukan dari dalam halaman / komponen react?
Saya belum menemukan apa pun tentang yang terakhir, dan saya lebih suka menghindari yang pertama. Kecuali itu adalah norma tentu saja, tetapi itu membuat saya bertanya-tanya bagaimana melakukan hal seperti itu tanpa harus menambahkan kode ke setiap halaman lain yang memungkinkan pengguna dapat pergi ..
Semua wawasan diterima, terima kasih!
reactjs
react-router
Barry Staes
sumber
sumber
componentWillUnmount() { if (confirm('Changes are saved, but not published yet. Do that now?')) { // publish and go away from a specific page } else { // do nothing and go away from a specific page } }
sehingga Anda dapat memanggil fungsi publikasikan sebelum meninggalkan lamanJawaban:
react-router
v4 memperkenalkan cara baru untuk memblokir navigasi menggunakanPrompt
. Cukup tambahkan ini ke komponen yang ingin Anda blokir:Ini akan memblokir perutean apa pun, tetapi bukan penyegaran atau penutupan halaman. Untuk memblokirnya, Anda harus menambahkan ini (memperbarui sesuai kebutuhan dengan siklus hidup React yang sesuai):
onbeforeunload memiliki berbagai dukungan oleh browser.
sumber
onberforeunload
peringatan.react-router
tidak mendukungnya di luar kotak (dengan asumsi tombol batal tidak memicu perubahan rute apa pun). Anda dapat membuat modal Anda sendiri untuk meniru perilaku tersebut.onbeforeunload
, Anda pasti ingin membersihkannya saat komponen Anda dilepas.componentWillUnmount() { window.onbeforeunload = null; }
Di react-router
v2.4.0
atau di atasnya dan sebelumnyav4
ada beberapa opsionLeave
untukRoute
setRouteLeaveHook
untukcomponentDidMount
Anda dapat mencegah transisi terjadi atau meminta pengguna sebelum meninggalkan rute dengan hook tinggalkan.
Perhatikan bahwa contoh ini memanfaatkan
withRouter
komponen tingkat tinggi yang diperkenalkan div2.4.0.
Namun solusi ini tidak bekerja dengan sempurna saat mengubah rute di URL secara manual
Dalam artian itu
Untuk
react-router v4
menggunakan riwayat Prompt atau kustom:Namun
react-router v4
, lebih mudah untuk diimplementasikan dengan bantuanPrompt
from'react-routerMenurut dokumentasi
Dalam metode render Anda, Anda hanya perlu menambahkan ini seperti yang disebutkan dalam dokumentasi sesuai kebutuhan Anda.
MEMPERBARUI:
Jika Anda ingin memiliki tindakan khusus yang harus diambil saat menggunakan meninggalkan halaman, Anda dapat menggunakan riwayat khusus dan mengkonfigurasi Router Anda seperti
history.js
dan kemudian di komponen Anda, Anda dapat menggunakan
history.block
sukasumber
<Prompt>
URL akan berubah saat Anda menekan Batal saat diminta. Masalah terkait: github.com/ReactTraining/react-router/issues/5405Untuk
react-router
2.4.0+CATATAN : Dianjurkan untuk memigrasi semua kode Anda ke yang terbaru
react-router
untuk mendapatkan semua barang baru.Seperti yang direkomendasikan dalam dokumentasi react-router :
Seseorang harus menggunakan
withRouter
komponen urutan yang lebih tinggi:Sebagai contoh ES6 dari dokumentasi:
sumber
Untuk
react-router
v3.xSaya memiliki masalah yang sama ketika saya membutuhkan pesan konfirmasi untuk setiap perubahan yang belum disimpan di halaman. Dalam kasus saya, saya menggunakan React Router v3 , jadi saya tidak dapat menggunakan
<Prompt />
, yang diperkenalkan dari React Router v4 .Saya menangani 'klik tombol kembali' dan 'klik tautan tidak disengaja' dengan kombinasi
setRouteLeaveHook
danhistory.pushState()
, dan menangani 'tombol muat ulang' denganonbeforeunload
pengendali kejadian.setRouteLeaveHook ( doc ) & history.pushState ( doc )
Hanya menggunakan setRouteLeaveHook saja tidak cukup. Untuk beberapa alasan, URL diubah meskipun halaman tetap sama ketika 'tombol kembali' diklik.
onbeforeunload ( doc )
Ini digunakan untuk menangani tombol 'muat ulang tidak disengaja'
Di bawah ini adalah komponen lengkap yang telah saya tulis
this.props.router
.this.props.route
diturunkan dari komponen pemanggilcatatan yang
currentState
dilewatkan sebagai prop untuk memiliki status awal dan untuk memeriksa setiap perubahanTolong beri tahu saya jika ada pertanyaan :)
sumber
Untuk
react-router
v0.13.x denganreact
v0.13.x:ini dimungkinkan dengan metode
willTransitionTo()
danwillTransitionFrom()
statis. Untuk versi yang lebih baru, lihat jawaban saya yang lain di bawah ini.Dari dokumentasi react-router :
Untuk
react-router
1.0.0-rc1 denganreact
v0.14.x atau yang lebih baru:ini harus dimungkinkan dengan
routerWillLeave
pengait siklus hidup. Untuk versi yang lebih lama, lihat jawaban saya di atas.Dari dokumentasi react-router :
Sesuatu. mungkin berubah sebelum rilis final.
sumber
Anda dapat menggunakan prompt ini.
sumber
Menggunakan history.listen
Contohnya seperti di bawah ini:
Di komponen Anda,
sumber