Di react-router v2.4.0
atau di atasnya dan sebelumnya v4
ada beberapa opsi
- Tambahkan fungsi
onLeave
untukRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Gunakan fungsi
setRouteLeaveHook
untukcomponentDidMount
Anda dapat mencegah transisi terjadi atau meminta pengguna sebelum meninggalkan rute dengan hook tinggalkan.
const Home = withRouter(
React.createClass({
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave)
},
routerWillLeave(nextLocation) {
// return false to prevent a transition w/o prompting the user,
// or return a string to allow the user to decide:
// return `null` or nothing to let other hooks to be executed
//
// NOTE: if you return true, other hooks will not be executed!
if (!this.state.isSaved)
return 'Your work is not saved! Are you sure you want to leave?'
},
// ...
})
)
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
- kita melihat Konfirmasi - ok
- berisi halaman tidak dimuat ulang - oke
- URL tidak berubah - tidak oke
Untuk react-router v4
menggunakan riwayat Prompt atau kustom:
Namun react-router v4
, lebih mudah untuk diimplementasikan dengan bantuan Prompt
from'react-router
Menurut dokumentasi
Cepat
Digunakan untuk meminta pengguna sebelum keluar dari halaman. Saat aplikasi Anda memasuki keadaan yang seharusnya mencegah pengguna keluar (seperti formulir yang setengah terisi), render a <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
pesan: string
Pesan untuk meminta pengguna saat mereka mencoba keluar.
<Prompt message="Are you sure you want to leave?"/>
pesan: func
Akan dipanggil dengan lokasi dan tindakan berikutnya yang coba dinavigasi oleh pengguna. Kembalikan string untuk menampilkan prompt kepada pengguna atau true untuk mengizinkan transisi.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
kapan: bool
Alih-alih merender secara kondisional di <Prompt>
belakang pelindung, Anda selalu dapat merendernya tetapi melewati when={true}
atau when={false}
untuk mencegah atau mengizinkan navigasi yang sesuai.
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
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
dan kemudian di komponen Anda, Anda dapat menggunakan history.block
suka
import { history } from 'path/to/history';
class MyComponent extends React.Component {
componentDidMount() {
this.unblock = history.block(targetLocation => {
// take your action here
return false;
});
}
componentWillUnmount() {
this.unblock();
}
render() {
//component render here
}
}
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 laman