Dengan react-router
saya dapat menggunakan Link
elemen untuk membuat tautan yang secara asli ditangani oleh router reaksi.
Saya melihat secara internal itu panggilan this.context.transitionTo(...)
.
Saya ingin melakukan navigasi. Bukan dari tautan, tetapi dari pilihan tarik turun (sebagai contoh). Bagaimana saya bisa melakukan ini dalam kode? Apa this.context
?
Saya melihat Navigation
mixin, tetapi bisakah saya melakukannya tanpa mixins
?
reactjs
react-router
George Mauer
sumber
sumber
Jawaban:
Ada
useHistory
kait baru di React Router> 5.1.0 jika Anda menggunakan React> 16.8.0 dan komponen fungsional.Dengan v4 dari React Router, ada tiga pendekatan yang dapat Anda ambil untuk routing terprogram dalam komponen.
withRouter
tingkat tinggi.<Route>
context
.React Router sebagian besar adalah pembungkus di sekitar
history
perpustakaan.history
menangani interaksi dengan browserwindow.history
untuk Anda dengan browser dan riwayat hash. Ini juga menyediakan riwayat memori yang berguna untuk lingkungan yang tidak memiliki riwayat global. Ini sangat berguna dalam pengembangan aplikasi seluler (react-native
) dan pengujian unit dengan Node.Sebuah
history
instance memiliki dua metode untuk navigasi:push
danreplace
. Jika Anda menganggaphistory
array sebagai lokasi yang dikunjungi,push
akan menambahkan lokasi baru ke array danreplace
akan mengganti lokasi saat ini dalam array dengan yang baru. Biasanya Anda ingin menggunakanpush
metode ini saat bernavigasi.Dalam versi sebelumnya dari Bereaksi Router, Anda harus membuat sendiri
history
misalnya, tapi di v4 yang<BrowserRouter>
,<HashRouter>
dan<MemoryRouter>
komponen akan membuat browser, hash, dan contoh memori untuk Anda. React Router membuat properti dan metodehistory
instance yang terkait dengan router Anda tersedia melalui konteks, di bawahrouter
objek.1. Gunakan komponen
withRouter
tingkat tinggiKomponen
withRouter
tingkat tinggi akan menyuntikkanhistory
objek sebagai penyangga komponen. Ini memungkinkan Anda untuk mengaksespush
danreplace
metode tanpa harus berurusan dengancontext
.2. Gunakan komposisi dan render a
<Route>
The
<Route>
komponen tidak hanya untuk lokasi yang cocok. Anda dapat membuat rute tanpa jalur dan akan selalu cocok dengan lokasi saat ini . The<Route>
komponen melewati alat peraga yang sama sepertiwithRouter
, sehingga Anda akan dapat mengakseshistory
metode melaluihistory
prop.3. Gunakan konteks *
Tapi Anda mungkin tidak seharusnya
Opsi terakhir adalah yang hanya boleh Anda gunakan jika Anda merasa nyaman bekerja dengan model konteks React (API Konteks React stabil pada v16).
1 dan 2 adalah pilihan paling sederhana untuk diterapkan, jadi untuk sebagian besar kasus penggunaan, itu adalah taruhan terbaik Anda.
sumber
withRouter
alih-alih melewatihistory
semua komponen saya ?? Gahh saya harus menghabiskan lebih banyak waktu membaca dokumen ...history.push('/new-location')
tanpa melampirkan perilaku itu ke Button atau elemen DOM lainnya?Unexpected use of 'history' no-restricted-globals
context
tidak eksperimental lagi pada reaksi 16.Anda dapat menggunakan
useHistory
pengait baru pada Komponen Fungsional dan secara terprogram menavigasi:Di 4.0 dan di atas, gunakan riwayat sebagai penyangga komponen Anda.
CATATAN: this.props.history tidak ada jika komponen Anda tidak dirender oleh
<Route>
. Anda harus menggunakannya<Route path="..." component={YourComponent}/>
untuk memiliki this.props.history di YourComponentDi 3.0 dan di atas, gunakan router sebagai penyangga komponen Anda.
Di 2.4 dan di atas, gunakan komponen urutan yang lebih tinggi untuk mendapatkan router sebagai penyangga komponen Anda.
Versi ini kompatibel dengan 1.x sehingga tidak perlu Panduan Upgrade. Hanya melalui contoh-contoh harus cukup baik.
Yang mengatakan, jika Anda ingin beralih ke pola baru, ada modul browserHistory di dalam router yang dapat Anda akses
import { browserHistory } from 'react-router'
Sekarang Anda memiliki akses ke riwayat browser Anda, sehingga Anda dapat melakukan hal-hal seperti mendorong, mengganti, dll ... Seperti:
browserHistory.push('/some/path')
Bacaan lebih lanjut: Sejarah dan Navigasi
Saya tidak akan masuk ke detail pemutakhiran. Anda dapat membaca tentang itu di Panduan Upgrade
Perubahan utama tentang pertanyaan di sini adalah perubahan dari Navigasi mixin ke Riwayat. Sekarang ia menggunakan histori browserAPI untuk mengubah rute sehingga kami akan menggunakannya
pushState()
mulai sekarang.Inilah contoh menggunakan Mixin:
Perhatikan bahwa ini
History
berasal dari rackt / history proyek . Bukan dari React-Router itu sendiri.Jika Anda tidak ingin menggunakan Mixin karena alasan tertentu (mungkin karena kelas ES6), maka Anda dapat mengakses riwayat yang Anda peroleh dari router
this.props.history
. Ini hanya akan dapat diakses untuk komponen yang diberikan oleh Router Anda. Jadi, jika Anda ingin menggunakannya dalam komponen anak apa pun, harus diturunkan sebagai atribut melaluiprops
.Anda dapat membaca lebih lanjut tentang rilis baru di mereka dokumentasi 1.0.x
Disini adalah halaman bantuan khusus tentang navigasi di luar komponen Anda
Ini merekomendasikan mengambil referensi
history = createHistory()
dan memanggilnyareplaceState
.Saya masuk ke masalah yang sama dan hanya bisa menemukan solusi dengan mixin Navigasi yang datang dengan router reaksi.
Begini cara saya melakukannya
Saya bisa menelepon
transitionTo()
tanpa perlu mengakses.context
Atau Anda bisa mencoba ES6 mewah
class
React-Router-Redux memiliki beberapa metode yang tersedia yang memungkinkan untuk navigasi sederhana dari pembuat aksi dalam. Ini dapat sangat berguna bagi orang-orang yang memiliki arsitektur di React Native, dan mereka ingin memanfaatkan pola yang sama di React Web dengan overhead boilerplate yang minimal.
Jelajahi metode berikut:
push(location)
replace(location)
go(number)
goBack()
goForward()
Berikut ini adalah contoh penggunaan, dengan Redux-Thunk :
./actioncreators.js
./viewcomponent.js
sumber
v2.4.0
tetapi pendekatan yang disebutkan tidak bekerja untuk saya, aplikasi saya tidak menghasilkan sama sekali dan output konsol:Uncaught TypeError: (0 , _reactRouter.withRouter) is not a function
inilah tautan ke posting SO saya: stackoverflow.com/questions/37306166/…2.6.0
.3.0.x
? Banyak orang tampaknya menggunakancontext
cara itu.this.props.history
tidak ada jika komponen Anda tidak dirender oleh<Route>
. Anda harus menggunakan<Route path="..." component={YourComponent}/>
untuk memilikithis.props.history
diYourComponent
.Untuk rilis terbaru (
v2.0.0-rc5
), metode navigasi yang disarankan adalah dengan langsung mendorong ke singleton sejarah. Anda dapat melihat bahwa dalam tindakan di bagian Navigasi di luar komponen .Kutipan yang relevan:
Jika menggunakan API reaksi-router yang lebih baru, Anda perlu memanfaatkan
history
darithis.props
saat di dalam komponen jadi:Itu juga menawarkan
pushState
tetapi itu usang per peringatan yang dicatat.Jika menggunakan
react-router-redux
, ia menawarkanpush
fungsi yang dapat Anda kirim seperti:Namun ini hanya dapat digunakan untuk mengubah URL, bukan untuk benar-benar menavigasi ke halaman.
sumber
import { browserHistory } from './react-router'
tetapi malah membuat riwayat menggunakanimport createBrowserHistory from 'history/lib/createBrowserHistory'
. Kemudian, Anda dapat mengakseshistory
dari komponen alat peraga:this.props.history('/some/path')
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
push
hanya mengubah URL, tidak benar-benar mengubah halaman. Untuk melakukan keduanya, imporbrowserHistory
darireact-router
dan gunakanbrowserHistory.push('/my-cool-path')
. Sayangnya, ini tidak super mudah ditemukan. github.com/reactjs/react-router/blob/master/docs/guides/…react-router
Begini cara Anda melakukan ini
react-router v2.0.0
dengan ES6 .react-router
telah pindah dari mixin.sumber
history
singleton seperti yang dinyatakan oleh @ Bob. Anda dapat menggunakancontext.router
tetapi Anda membuatnya sangat sulit untuk menguji unit komponen-komponen tersebut sebagai instantiating hanya komponen yang tidak akan memiliki ini dalam konteksnya.Pada akhirnya, saya ingin memiliki objek sejarah tunggal yang dapat saya bawa bahkan komponen luar. Yang ingin saya lakukan adalah memiliki satu file history.js yang saya impor sesuai permintaan, dan hanya memanipulasinya.
Anda hanya perlu mengubah
BrowserRouter
ke Router, dan tentukan prop sejarah. Ini tidak mengubah apa pun untuk Anda kecuali bahwa Anda memiliki objek sejarah Anda sendiri yang dapat Anda manipulasi seperti yang Anda inginkan.Anda perlu menginstal histori , perpustakaan yang digunakan oleh
react-router
.Contoh penggunaan, notasi ES6:
history.js
BasicComponent.js
Jika Anda harus menavigasi dari komponen yang sebenarnya dirender dari
Route
komponen, Anda juga dapat mengakses riwayat dari alat peraga, seperti itu:BasicComponent.js
sumber
Router
bukanBrowserRouter
.BrowserRouter
membuat dan memeliharahistory
objek untuk Anda. Anda seharusnya tidak membuat default sendiri, hanya jika Anda ["membutuhkan integrasi yang dalam dengan alat manajemen negara seperti Redux."] Reacttraining.com/react-router/web/api/Routerthis.props.history
, saya belum menemukan solusi yang dapat membantu saya melakukan hal seperti itu di kelas yang bukan komponen atau alat lain yang tidak dibangun sebagai komponen Bereaksi yang Anda dapat menurunkan alat peraga. Terima kasih atas tanggapan Anda :)Untuk yang ini, yang tidak mengontrol sisi server dan karena ini menggunakan router hash v2:
Tempatkan riwayat Anda ke dalam file terpisah (mis. App_history.js ES6):
Dan gunakan di mana-mana!
Titik masuk Anda untuk react-router (app.js ES6):
Navigasi Anda di dalam komponen apa pun (ES6):
sumber
history
untuk kedua pendekatan sekarangtl: dr;
Jawaban sederhana dan deklaratif adalah bahwa Anda harus menggunakan
<Redirect to={URL} push={boolean} />
dalam kombinasi dengansetState()
Contoh lengkap di sini . Baca lebih lanjut di sini .
PS. Contoh ini menggunakan ES7 + Properti Inisialisasi untuk menginisialisasi keadaan. Lihat di sini juga, jika Anda tertarik.
sumber
withRouter
tidak berfungsi saat sudah berada di rute yang sedang dimuat ulang. Dalam kasus kami, kami harus selektif melakukansetState
(menyebabkanreturn <Redirect>
) jika sudah di rute atauhistory.push()
dari tempat lain.Anda dapat melakukannya tanpa mixin juga.
Gotcha dengan konteksnya adalah bahwa itu tidak dapat diakses kecuali jika Anda mendefinisikan
contextTypes
di kelas.Adapun apa konteksnya, itu adalah objek, seperti properti, yang diturunkan dari orangtua ke anak, tetapi diturunkan secara implisit, tanpa harus mendeklarasikan ulang properti setiap kali. Lihat https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html
sumber
Saya mencoba setidaknya 10 cara untuk melakukan ini sebelum sesuatu berhasil!
Jawaban @Felipe Skinner
withRouter
agak berlebihan bagi saya, dan saya tidak yakin ingin membuat nama kelas "ExportedWithRouter" yang baru.Inilah cara paling sederhana dan paling bersih untuk melakukannya, sekitar saat ini React-Router 3.0.0 dan ES6:
atau, jika bukan kelas default Anda, ekspor suka:
Perhatikan bahwa pada 3.xx,
<Link>
komponen itu sendiri sedang digunakanrouter.push
, sehingga Anda dapat memberikan apa pun yang Anda berikan pada<Link to=
tag, seperti:sumber
200 OK
bukannya30x
kode. Bagaimana saya bisa memperbaiki masalah ini?Untuk melakukan navigasi secara terprogram, Anda perlu mendorong riwayat baru ke props.history di Anda
component
, jadi sesuatu seperti ini dapat melakukan pekerjaan untuk Anda:sumber
Untuk komponen ES6 + Bereaksi, solusi berikut ini bekerja untuk saya.
Saya mengikuti Felippe skinner, tetapi menambahkan solusi ujung ke ujung untuk membantu pemula seperti saya.
Di bawah ini adalah versi yang saya gunakan:
Di bawah ini adalah komponen reaksi saya di mana saya menggunakan navigasi terprogram menggunakan react-router:
Di bawah ini adalah konfigurasi untuk router saya:
sumber
Mungkin bukan pendekatan terbaik tapi ... Menggunakan react-router v4, TypeScript berikut dapat memberikan ide bagi sebagian orang.
Dalam komponen yang diberikan di bawah ini, misalnya
LoginPage
,router
objek dapat diakses dan hanya panggilanrouter.transitionTo('/homepage')
untuk menavigasi.Kode navigasi diambil dari .
"react-router": "^4.0.0-2",
"react": "^15.3.1",
sumber
Anda bisa menggunakan
withRouter
danthis.props.history.push
.sumber
Untuk digunakan
withRouter
dengan komponen berbasis kelas, coba sesuatu seperti ini di bawah ini. Jangan lupa untuk mengubah pernyataan ekspor untuk digunakanwithRouter
:import { withRouter } from 'react-router-dom'
sumber
berdasarkan jawaban sebelumnya
dari José Antonio Postigo dan Ben Wheeler
hal yang baru? harus ditulis dalam naskah
dan penggunaan dekorator
ATAU properti / bidang statis
dengan nPM apa pun yang diinstal hari ini. "react-router": "^ 3.0.0" dan
"@ types / react-router": "^ 2.0.41"
sumber
dengan React-Router v4 di cakrawala, sekarang ada cara baru untuk melakukan ini.
react-lego adalah aplikasi contoh yang menunjukkan cara menggunakan / memperbarui router reaksi dan itu termasuk contoh tes fungsional yang menavigasi aplikasi.
sumber
Dalam bereaksi router v4. Saya mengikuti dua cara ini untuk merutekan secara programatis.
Nomor dua
Untuk mendapatkan riwayat dalam alat peraga Anda mungkin harus membungkus komponen Anda dengan
sumber
Jika Anda menggunakan hash atau riwayat browser maka Anda dapat melakukannya
sumber
hashHistory.push
, memberi Cannot read properti "push" dari undefined. Dari mana Anda mengimpor ini?Dengan versi Bereaksi saat ini (15.3),
this.props.history.push('/location');
berfungsi untuk saya, tetapi ini menunjukkan peringatan berikut:dan saya menyelesaikannya menggunakan
context.router
seperti ini:sumber
React-Router V4
jika Anda menggunakan versi 4 maka Anda dapat menggunakan perpustakaan saya (plug Shameless) di mana Anda hanya mengirim tindakan dan semuanya hanya berfungsi!
trippler
sumber
Mereka yang menghadapi masalah dalam mengimplementasikan ini pada react-router v4.
Berikut adalah solusi yang berfungsi untuk menavigasi melalui aplikasi reaksi dari tindakan redux.
history.js
App.js / Route.jsx
another_file.js ATAU file redux
Semua berkat komentar ini: ReactTraining mengeluarkan komentar
sumber
Jika kebetulan memasangkan RR4 dengan redux melalui react-router-redux , gunakan pembuat tindakan perutean dari
react-router-redux
opsi juga.Jika menggunakan redux thunk / saga untuk mengelola aliran async, impor pembuat tindakan di atas dalam aksi redux dan kait untuk bereaksi komponen menggunakan mapDispatchToProps mungkin lebih baik.
sumber
react-router-redux
telah ditinggalkan / diarsipkan untuk waktu yang lamaAnda juga dapat menggunakan
useHistory
pengait di komponen tanpa kewarganegaraan. Contoh dari dokumen.sumber
Jawaban yang tepat bagi saya pada saat penulisan
Tetapi Anda perlu menambahkan PropTypes ke komponen Anda
Jangan lupa untuk mengimpor PropTypes
sumber
Mungkin bukan solusi terbaik tetapi menyelesaikan pekerjaan:
Pada dasarnya, sebuah logika terkait dengan satu tindakan (dalam hal ini penghapusan posting) akan berakhir memanggil pemicu untuk redirect. Ini tidak ideal karena Anda akan menambahkan 'pemicu' simpul DOM ke markup Anda sehingga Anda dapat dengan mudah menyebutnya ketika dibutuhkan. Juga, Anda akan langsung berinteraksi dengan DOM, yang dalam komponen Bereaksi mungkin tidak diinginkan.
Namun, jenis pengalihan ini tidak sering diperlukan. Jadi satu atau dua ekstra, tautan tersembunyi di markup komponen Anda tidak akan terlalu sakit, terutama jika Anda memberi mereka nama yang bermakna.
sumber
Ini bekerja untuk saya, tidak perlu impor khusus:
sumber
history
ditambahkanprops
dengan sendirinya. Itu berasal dari HoC yang perlu Anda impor untuk menggunakan (komponen yang dikirim langsung olehRoute
secara otomatis dibungkus oleh HoC itu tetapi kemudian Anda perlu impor untukRoute
...)gunakan hookrouter sebagai gantinya, alternatif modern untuk bereaksi-router
https://www.npmjs.com/package/hookrouter
untuk menjawab pertanyaan OP tentang menautkan melalui kotak pilih Anda dapat melakukannya:
sumber
Dengan asumsi bahwa Anda tidak perlu menavigasi selama render awal itu sendiri (untuk itu Anda dapat menggunakan
<Redirect>
komponen), inilah yang kami lakukan di aplikasi kami.Tentukan rute kosong yang mengembalikan null, ini akan memungkinkan Anda untuk mendapatkan akses ke objek sejarah. Anda perlu melakukan ini di tingkat atas di mana Anda
Router
didefinisikan.Sekarang Anda dapat melakukan semua hal yang bisa dilakukan pada sejarah seperti
history.push()
,history.replace()
,history.go(-1)
dll!sumber
react-router-dom: 5.1.2
Situs ini memiliki 3 halaman, yang semuanya dirender secara dinamis di browser.
Meskipun halaman tidak pernah di-refresh, perhatikan bagaimana React Router membuat URL selalu terbarui saat Anda menavigasi situs. Ini menjaga riwayat browser, memastikan hal-hal seperti tombol kembali dan bookmark berfungsi dengan baik
Sebuah Beralih terlihat melalui semua elemen anak dan menjadikan yang pertama yang jalan dengan URL saat ini. Gunakan waktu kapan saja Anda memiliki banyak rute, tetapi Anda hanya ingin satu dari mereka untuk membuat sekaligus
sumber
Jadi dalam jawaban saya ada 3 cara berbeda untuk mengarahkan secara terprogram ke suatu rute. Beberapa solusi telah disajikan tetapi yang berikut ini hanya difokuskan untuk komponen fungsional dengan aplikasi demo tambahan.
Menggunakan versi berikut:
Konfigurasi:
Jadi pertama-tama solusinya menggunakan
HashRouter
, dikonfigurasi sebagai berikut:Dari dokumentasi tentang
<HashRouter>
:Solusi:
<Redirect>
untuk mendorong menggunakanuseState
:Menggunakan dalam komponen fungsional (
RedirectPushAction
komponen dari repositori saya) yang dapat kita gunakanuseState
untuk menangani pengalihan. Bagian yang rumit adalah begitu pengalihan terjadi kita perlu mengaturredirect
negara kembali kefalse
. Dengan menggunakansetTimeOut
dengan0
penundaan kami menunggu hingga Bereaksi berkomitmenRedirect
untuk DOM kemudian mendapatkan kembali tombol untuk menggunakan waktu berikutnya.Silakan temukan contoh saya di bawah ini:
Dari
<Redirect>
dokumentasi:useHistory
kait:Dalam solusi saya ada komponen yang disebut
UseHistoryAction
yang mewakili yang berikut:withRouter
, dapatkanhistory
dariprops
:Dibuat satu komponen bernama
WithRouterAction
, ditampilkan sebagai berikut:Membaca dari
withRouter
dokumentasi:Demo:
Untuk representasi yang lebih baik, saya telah membangun repositori GitHub dengan contoh-contoh ini, silakan temukan di bawah ini:
https://github.com/norbitrial/react-router-programmatically-redirect-examples
Saya harap ini membantu!
sumber