Pemrograman menavigasi menggunakan bereaksi router
Dengan bereaksi-router
saya dapat menggunakan Link
elemen untuk membuat link yang native ditangani oleh bereaksi router.
Saya melihat secara internal itu panggilan ini.konteks.transitionTo(...)
.
Saya ingin melakukan navigasi, tapi bukan dari link, dari pilihan dropdown misalnya. Bagaimana saya bisa melakukan ini dalam kode? Apa ini.konteks
?
Aku melihat Navigasi
mixin, tapi saya bisa melakukan hal ini tanpa mixin?
1245
30
Ada yang baru
useHistory
hook dalam Bereaksi Router >5.1.0 jika anda menggunakan Bereaksi >16.8.0 dan komponen fungsional.Dengan v4 Bereaksi Router, ada tiga pendekatan yang dapat anda ambil untuk program routing dalam komponen-komponen.
withRouter
higher-order komponen.<Rute>
konteks
.Bereaksi Router adalah sebagian besar bungkus sekitar
sejarah
perpustakaan.sejarah
menangani interaksi dengan browser'sjendela.sejarah
untuk anda dengan browser dan hash sejarah. Hal ini juga menyediakan memori sejarah yang berguna untuk lingkungan yang don't memiliki sejarah global. Hal ini sangat berguna dalam pengembangan aplikasi mobile (bereaksi-asli
) dan unit pengujian dengan Node.Sebuah
sejarah
contoh memiliki dua metode untuk navigasi:push
danmenggantikan
. Jika anda berpikir tentangsejarah
sebagai array dari lokasi yang dikunjungi,push
akan menambah lokasi baru untuk array danmenggantikan
akan menggantikan lokasi saat ini dalam array dengan yang baru. Biasanya anda akan ingin menggunakanpush
metode ketika anda menavigasi.Dalam versi sebelumnya dari Bereaksi Router, anda harus membuat sendiri
sejarah
misalnya, tapi di v4<BrowserRouter>
,<HashRouter>
, dan<MemoryRouter>
komponen akan membuat browser, hash, dan memori contoh untuk anda. Bereaksi Router membuat properti dan metode darisejarah
contoh yang berhubungan dengan router anda, tersedia melalui konteks, di bawahrouter
objek.1. Gunakan
withRouter
higher-order komponenThe
withRouter
higher-order komponen akan menyuntikkansejarah
objek sebagai penyangga komponen. Hal ini memungkinkan anda untuk mengaksespush
danmenggantikan
metode tanpa harus berurusan dengankonteks
.2. Gunakan komposisi dan membuat
<Rute>
The
<Rute>
komponen isn't hanya untuk lokasi yang cocok. Anda dapat membuat rute jalan tanpa dan itu akan selalu sesuai dengan lokasi saat ini. The<Rute>
komponen melewati peraga yang sama sebagaiwithRouter
, sehingga anda akan dapat mengaksessejarah
metode melaluisejarah
prop.3. Menggunakan konteks*
Tapi anda mungkin tidak harus
Opsi terakhir adalah salah satu yang anda hanya harus menggunakan jika anda merasa nyaman bekerja dengan Bereaksi's konteks model. Meskipun konteks adalah sebuah pilihan, melainkan harus menekankan bahwa konteks adalah tidak stabil API dan Bereaksi memiliki bagian Mengapa Tidak Menggunakan Konteks di dokumentasi mereka. Jadi gunakan dengan resiko anda sendiri!
1 dan 2 adalah pilihan yang paling sederhana untuk melaksanakan, sehingga untuk sebagian besar kasus, mereka adalah taruhan terbaik anda.
Selain itu anda bisa mendapatkan lebih banyak pengetahuan dari link di bawah ini tentang Routing, URL Parameter dan Bersarang routing.
Routing dalam Bereaksi JS
URL Parameter Bereaksi dengan Router
Bersarang Rute dalam Bereaksi JS
Harap ini akan membantu anda!
Anda dapat menggunakan baru
useHistory
kail pada Komponen Fungsional dan Pemrograman menavigasi:Di 4.0 dan di atas, menggunakan sejarah sebagai penyangga dari komponen anda.
CATATAN: ini.alat peraga.sejarah tidak ada dalam kasus anda komponen tidak diberikan oleh
<Rute>
. Anda harus menggunakan<Rute jalur="..." komponen={YourComponent}/>
ini.alat peraga.sejarah di YourComponentDi 3.0 dan di atas, penggunaan router sebagai penyangga dari komponen anda.
Di 2,4 dan di atas, penggunaan yang lebih tinggi komponen rangka untuk mendapatkan router sebagai penyangga dari komponen anda.
Versi ini kompatibel dengan 1.x jadi ada's tidak perlu Upgrade Guide. Hanya akan melalui contoh-contoh harus cukup baik.
Yang mengatakan, jika anda ingin beralih ke pola baru, di sana's browserHistory modul di dalam router yang dapat anda akses dengan
impor { browserHistory } dari 'bereaksi-router'
Sekarang anda memiliki akses ke sejarah browser anda, sehingga anda dapat melakukan hal-hal seperti mendorong, mengganti, dll... Seperti:
browserHistory.push('/beberapa/jalan')
Bacaan lebih lanjut: Sejarah dan Navigation
Aku tidak akan pergi ke upgrade rincian. Anda dapat membaca tentang itu di Panduan Upgrade
Perubahan utama tentang pertanyaan di sini adalah perubahan dari Navigasi mixin Sejarah. Sekarang ini's menggunakan browser historyAPI untuk mengubah rute jadi kita akan menggunakan
pushState()
dari sekarang.Berikut ini's sebuah contoh menggunakan Mixin:
Catatan bahwa ini
Sejarah
berasal dari rackt/sejarah proyek. Tidak Bereaksi dari Router itu sendiri.Jika anda don't ingin menggunakan Mixin untuk beberapa alasan (mungkin karena ES6 kelas), maka anda dapat mengakses sejarah yang anda dapatkan dari router dari
ini.alat peraga.sejarah
. Itu akan hanya dapat diakses untuk komponen yang diberikan oleh Router anda. Jadi, jika anda ingin menggunakannya dalam setiap komponen anak itu perlu diturunkan sebagai atribut melaluialat peraga
.Anda dapat membaca lebih lanjut tentang rilis baru mereka 1.0.x dokumentasi
Berikut ini adalah halaman bantuan khusus tentang navigasi luar component
Itu merekomendasikan meraih referensi sejarah
= createHistory()
dan memanggilreplaceState
itu.Saya punya masalah yang sama dan hanya bisa menemukan solusi dengan Navigasi mixin yang datang dengan bereaksi-router.
Berikut ini's bagaimana saya melakukannya
Saya bisa sebut
transitionTo()
tanpa perlu akses.konteks
Atau anda bisa mencoba yang mewah ES6
kelas
Bereaksi-Router-Redux telah beberapa metode tersedia yang memungkinkan untuk mudah menavigasi dari dalam aksi pencipta. Ini dapat sangat berguna untuk orang-orang yang memiliki arsitektur yang ada dalam Bereaksi Asli, dan mereka ingin memanfaatkan pola-pola yang sama dalam Bereaksi Web dengan minimal boilerplate overhead.
Mengeksplorasi metode berikut:
push(lokasi)
ganti(lokasi)
pergi(nomor)
goBack()
goForward()
Berikut adalah contoh penggunaan, dengan Redux-Thunk:
./actioncreators.js
./viewcomponent.js
Untuk rilis terbaru (
v2.0.0-rc5
), yang direkomendasikan navigasi adalah dengan metode langsung mendorong ke sejarah singleton. Anda dapat melihat bahwa dalam aksi di Menavigasi di luar dari Komponen doc.Terkait kutipan:
Jika menggunakan lebih baru bereaksi-router API, anda perlu membuat
sejarah
dariini.alat peraga
ketika dalam komponen sehingga:Hal ini juga menawarkan
pushState
tapi itu tak berlaku lagi per login peringatan.Jika menggunakan
bereaksi-router-redux
, ia menawarkanpush
fungsi anda dapat mengirimkan seperti:Namun ini mungkin hanya digunakan untuk mengubah URL, bukan untuk benar-benar menavigasi ke halaman.
Berikut ini's bagaimana anda melakukan ini dengan
bereaksi-router v2.0.0
dengan ES6.bereaksi-router
telah pindah dari mixin.Pada akhir saya, saya ingin memiliki satu sejarah objek yang saya dapat melakukan bahkan di luar komponen. Apa yang saya ingin lakukan adalah untuk memiliki satu history.js file yang saya impor pada permintaan, dan hanya memanipulasi itu.
Anda hanya perlu mengubah
BrowserRouter
ke Router, dan menentukan sejarah prop. Ini doesn't mengubah apa pun untuk anda, kecuali bahwa anda memiliki anda sendiri sejarah objek yang anda dapat memanipulasi seperti yang anda inginkan.Anda perlu menginstal sejarah, perpustakaan yang digunakan oleh
bereaksi-router
.Contoh penggunaan, ES6 notasi :
history.js
BasicComponent.js
Jika anda harus menavigasi dari komponen yang benar-benar diberikan dari
Rute
komponen, anda juga dapat mengakses sejarah dari alat peraga, seperti :BasicComponent.js
Untuk yang satu ini, siapa yang tidak mengontrol sisi server dan karena ini adalah menggunakan hash router v2:
Tempat anda sejarah ke dalam file terpisah (misalnya app_history.js ES6):
Dan menggunakannya di mana-mana!
Entry point anda untuk bereaksi-router (app.js ES6):
Navigasi anda dalam setiap komponen (ES6):
tl:dr;
Sederhana dan deklaratif jawabannya adalah bahwa anda perlu menggunakan
<Redirect ke={URL} push={boolean} />
dalam kombinasi dengansetState()
Contoh penuh di sini. Baca lebih lanjut di sini.
PS. Contoh menggunakan ES7+ Properti Penginisialisasi untuk menginisialisasi negara. Lihat di sini dan juga, jika anda're tertarik.
Anda dapat melakukan ini tanpa mixin juga.
Yang gotcha dengan konteks adalah bahwa hal itu tidak dapat diakses kecuali anda mendefinisikan
contextTypes
di kelas.Seperti apa konteks, itu adalah sebuah objek, seperti alat peraga, yang diturunkan dari orang tua ke anak, tetapi diturunkan secara implisit, tanpa harus redeclare alat peraga masing-masing waktu. Lihat https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html
Aku mencoba setidaknya 10 cara untuk melakukan hal ini sebelum sesuatu yang tidak bekerja dengan benar!
@Felipe Skinner's
withRouter
jawaban itu agak luar biasa untuk saya, dan saya tidak't yakin saya ingin membuat yang baru "ExportedWithRouter" nama kelas.Berikut ini's sederhana dan bersih untuk melakukannya, circa saat ini Bereaksi-Router 3.0.0 dan ES6:
atau, jika itu's tidak default kelas, ekspor seperti:
Perhatikan bahwa dalam 3.x.x,
<Link>
komponen itu sendiri adalah dengan menggunakanrouter.push
, sehingga anda dapat melewati itu apa pun yang anda akan lulus<Link ke=
tag, seperti:Untuk melakukan navigasi pemrograman, anda perlu untuk mendorong baru *sejarah * ke alat peraga.sejarah** di
komponen
, jadi hal seperti ini dapat melakukan pekerjaan untuk anda:Tidak mungkin pendekatan yang terbaik tapi... Menggunakan bereaksi-router v4, berikut Ketangkasan bisa memberikan gambaran untuk beberapa.
Di diberikan komponen di bawah ini, misal
LoginPage
,router
objek dapat diakses dan hanya memanggilrouter.transitionTo('/homepage')
untuk menavigasi.Navigasi kode diambil dari.
"bereaksi-router": "^4.0.0-2",
"bereaksi": "^pasak 15.3.1",
Untuk ES6 + Bereaksi komponen, berikut solusi yang bekerja untuk saya.
Aku mengikuti Felippe skinner, tetapi menambahkan ujung ke ujung solusi untuk membantu pemula seperti saya.
Berikut ini adalah versi saya digunakan:
Di bawah ini saya bereaksi komponen mana saya digunakan program navigasi menggunakan bereaksi-router:
Berikut adalah konfigurasi untuk router saya:
Anda dapat menggunakan
withRouter
danini.alat peraga.sejarah.push
.Untuk menggunakan
withRouter
dengan kelas berbasis komponen, mencoba sesuatu seperti ini di bawah ini. Don't lupa untuk mengubah pernyataan ekspor untuk menggunakanwithRouter
:impor { withRouter } dari 'bereaksi-router-dom'
berdasarkan jawaban sebelumnya dari José Antonio Postigo dan Ben Wheeler hal-hal baru? ditulis dalam Naskah dan penggunaan dekorator ATAU statis properti/bidang
dengan apapun npm dipasang hari ini. "bereaksi-router": "^3.0.0" dan "@jenis/bereaksi-router": "^2.0.41"
Dalam bereaksi router v4. Saya mengikuti dua cara untuk rute pemrograman.
Nomor dua
Untuk mendapatkan sejarah di alat peraga yang mungkin anda miliki untuk membungkus komponen dengan
dengan Bereaksi-Router v4 di cakrawala, sekarang ada cara baru untuk melakukan hal ini.
bereaksi-lego adalah contoh aplikasi yang menunjukkan cara menggunakan/update bereaksi-router dan itu termasuk contoh tes fungsional yang menavigasi aplikasi.
Jika anda menggunakan hash atau sejarah browser maka anda dapat melakukan
Dengan saat ini Bereaksi versi (15.3),
ini.alat peraga.sejarah.push('/lokasi');
bekerja untuk saya, tapi itu menunjukkan peringatan berikut:dan aku dipecahkan menggunakan
konteks.router
seperti ini:Bereaksi-Router V4
jika anda'kembali menggunakan versi 4 maka anda dapat menggunakan perpustakaan saya (Shameless plug) di mana anda hanya mengirimkan sebuah tindakan dan segala sesuatu yang hanya bekerja!
trippler