Saya memiliki beberapa tombol yang berfungsi sebagai rute. Setiap kali rute diubah, saya ingin memastikan tombol yang aktif berubah.
Apakah ada cara untuk mendengarkan perubahan rute pada router reaksi v4?
react-router-v4
Kasper
sumber
sumber
Jawaban:
Saya gunakan
withRouter
untuk mendapatkanlocation
prop. Ketika komponen diperbarui karena rute baru, saya memeriksa apakah nilainya berubah:Semoga ini bisa membantu
sumber
withRouter
, tetapi saya mendapatkan kesalahanYou should not use <Route> or withRouter() outside a <Router>
. Saya tidak melihat<Router/>
komponen dalam kode di atas. Jadi bagaimana cara kerjanya?<Switch>
komponen tersebut bertindak sebagai router de-facto. Hanya<Route>
entri pertama yang memiliki jalur yang cocok, akan diberikan. Tidak perlu<Router/>
komponen apa pun dalam skenario iniUntuk memperluas di atas, Anda harus mendapatkan objek sejarah. Jika Anda menggunakan
BrowserRouter
, Anda dapat mengimporwithRouter
dan membungkus komponen Anda dengan komponen orde tinggi (HoC) agar memiliki akses melalui alat peraga ke properti dan fungsi objek sejarah.Satu-satunya hal yang perlu diperhatikan adalah bahwa denganouter dan sebagian besar cara lain untuk mengakses
history
tampaknya mencemari alat peraga ketika mereka de-struktur objek ke dalamnya.sumber
withRoutes
untukwithRouter
.history
bukan variabellisten
.Anda harus menggunakan riwayat v4 lib.
Contoh dari sana
sumber
history.push
memicuhistory.listen
. Lihat contoh Menggunakan URL Pangkalan di riwayat v4 docs . Karena ituhistory
sebenarnya pembungkushistory
objek asli browser, itu tidak berperilaku persis seperti yang asli.const unlisten = history.listen(myListener); unlisten();
withRouter
,,history.listen
danuseEffect
(React Hooks) bekerja sangat baik bersama-sama:Panggilan balik pendengar akan diaktifkan setiap kali rute diubah, dan pengembaliannya
history.listen
adalah penangan shutdown yang bekerja dengan baikuseEffect
.sumber
v5.1 memperkenalkan kait berguna
useLocation
https://reacttraining.com/blog/react-router-v5-1/#uselokasi
sumber
Cannot read property 'location' of undefined at useLocation
. Anda perlu memastikan bahwa panggilan useLocation () tidak berada di komponen yang sama dengan yang menempatkan router ke pohon: lihat di siniDengan kait:
Impor dan render sebagai
<DebugHistory>
komponensumber
dengan kait
sumber
sumber
Dengan Hooks bereaksi, saya menggunakan
useEffect
sumber
Dalam beberapa kasus, Anda mungkin menggunakan
render
atribut alih-alihcomponent
, dengan cara ini:Perhatikan bahwa jika Anda mengubah status dalam
onRouteChange
metode, ini dapat menyebabkan kesalahan 'Kedalaman pembaruan maksimum terlampaui'.sumber
Dengan
useEffect
kait itu mungkin untuk mendeteksi perubahan rute tanpa menambahkan pendengar.sumber
Saya hanya berurusan dengan masalah ini, jadi saya akan menambahkan solusi saya sebagai suplemen pada jawaban lain yang diberikan.
Masalahnya di sini adalah bahwa
useEffect
tidak benar-benar berfungsi seperti yang Anda inginkan, karena panggilan hanya akan dipicu setelah render pertama sehingga ada penundaan yang tidak diinginkan.Jika Anda menggunakan beberapa pengelola negara seperti redux, kemungkinan Anda akan mendapatkan layar berkedip karena keadaan yang tersisa di toko.
Apa yang benar-benar Anda inginkan adalah menggunakan
useLayoutEffect
karena ini akan segera dipicu.Jadi saya menulis fungsi utilitas kecil yang saya taruh di direktori yang sama dengan router saya:
Yang saya panggil dari dalam komponen HOC seperti ini:
path
adalah penyangga yang dilewatkan dimatch
objek saat menggunakanwithRouter
.Saya tidak terlalu suka mendengarkan / tidak mendengarkan secara manual tentang sejarah. Itu hanya imo.
sumber