Dalam versi React Router (v3) saat ini, saya dapat menerima respons server dan gunakan browserHistory.push
untuk membuka halaman respons yang sesuai. Namun, ini tidak tersedia di v4, dan saya tidak yakin apa cara yang tepat untuk menangani ini.
Dalam contoh ini, menggunakan Redux, komponen / app-product-form.js panggilan this.props.addProduct(props)
saat pengguna mengirimkan formulir. Ketika server mengembalikan sukses, pengguna dibawa ke halaman Cart.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
Bagaimana saya bisa membuat redirect ke halaman Cart dari fungsi untuk React Router v4?
context
untuk melewati apa yang Anda butuhkan secara manual adalah "no go". Kecuali saya seorang penulis perpustakaan, seharusnya tidak perlu menggunakannya. Bahkan, Facebook merekomendasikan untuk tidak melakukannya.history
juga berfungsi untuk React Native sebagai opsi dan juga opsi tambahan untuk mendukung browser lawas.Jawaban:
Anda dapat menggunakan
history
metode di luar komponen Anda. Coba dengan cara berikut.Pertama, buat
history
objek menggunakan paket histori :Kemudian bungkus
<Router>
( harap dicatat , Anda harus menggunakannyaimport { Router }
sebagai gantinyaimport { BrowserRouter as Router }
):Ubah lokasi Anda saat ini dari tempat mana pun, misalnya:
UPD : Anda juga dapat melihat contoh yang sedikit berbeda di React Router FAQ .
sumber
history.push('some path')
, URL berubah tetapi halaman tidak berubah. Saya harus meletakkannyawindow.location.reload()
di beberapa bagian kode saya hanya untuk membuatnya bekerja. Namun, dalam satu contoh saya harus menyimpan pohon redux state, dan memuat ulang menghancurkannya. Ada solusi lain?withRouter
tingkat tinggi.import createHistory from 'history/createBrowserHistory'; export default createHistory();
akan berhasil.React Router v4 pada dasarnya berbeda dari v3 (dan sebelumnya) dan Anda tidak dapat melakukan
browserHistory.push()
seperti dulu.Diskusi ini tampaknya terkait jika Anda ingin info lebih lanjut:
Alih-alih, Anda memiliki beberapa opsi untuk melakukan ini:
Gunakan komponen
withRouter
tingkat tinggiAlih-alih, Anda harus menggunakan
withRouter
komponen pesanan tinggi, dan membungkusnya dengan komponen yang akan mendorong ke sejarah. Sebagai contoh:Lihat dokumentasi resmi untuk info lebih lanjut:
Gunakan
context
APIMenggunakan konteks mungkin merupakan salah satu solusi termudah, tetapi karena API eksperimental itu tidak stabil dan tidak didukung. Gunakan hanya ketika semuanya gagal. Ini sebuah contoh:
Lihat dokumentasi resmi tentang konteks:
sumber
this.context.router.history.push('/path');
Sekarang dengan react-router v5 Anda dapat menggunakan hook siklus hidup useHistory seperti ini:
baca lebih lanjut di: https://reacttraining.com/react-router/web/api/Hooks/usehistory
sumber
let history = useHistory();
tetapi mendapatkanObject is not callable
kesalahan, ketika saya mencoba melihat apa yang digunakan oleh Histori, apakahconsole.log(useHistory)
itu ditampilkan sebagai tidak terdefinisi. menggunakan"react-router-dom": "^5.0.1"
Cara paling sederhana dalam React Router 4 adalah menggunakan
Tetapi untuk menggunakan metode ini, komponen Anda yang ada harus memiliki akses ke
history
objek. Kami bisa mendapatkan akses denganJika komponen Anda terhubung
Route
secara langsung, maka komponen Anda sudah memiliki akses kehistory
objek.misalnya:
Di sini
ViewProfile
memiliki akses kehistory
.Jika tidak terhubung
Route
langsung.misalnya:
Maka kita harus menggunakan
withRouter
, perintah yang lebih tinggi untuk melengkungkan komponen yang ada.ViewUsers
Komponen di dalamimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
Itu saja sekarang,
ViewUsers
komponen Anda memiliki akses kehistory
objek.MEMPERBARUI
2
- dalam skenario ini, lewati semua ruteprops
ke komponen Anda, dan kemudian kita dapat mengaksesthis.props.history
dari komponen bahkan tanpa aHOC
misalnya:
sumber
this.props.history
) berasal dari HOC, yang berarti bahwa itu tidak terkait langsung denganRoute
, seperti yang Anda jelaskan.Beginilah cara saya melakukannya:
Gunakan
this.props.history.push('/cart');
untuk mengarahkan ke halaman keranjang itu akan disimpan di objek sejarah.Selamat menikmati, Michael.
sumber
Menurut dokumentasi React Router v4 - sesi Redux Deep Integration
Diperlukan integrasi yang dalam untuk:
Namun, mereka merekomendasikan pendekatan ini sebagai alternatif untuk "integrasi mendalam":
Jadi, Anda dapat membungkus komponen Anda dengan komponen pesanan tinggi withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
yang akan meneruskan API riwayat ke alat peraga. Jadi, Anda dapat memanggil pencipta aksi yang meneruskan sejarah sebagai param. Misalnya, di dalam ReactComponent Anda:
Lalu, di dalam action / index.js Anda:
sumber
Pertanyaan jahat, butuh waktu cukup lama, tetapi akhirnya, saya menyelesaikannya dengan cara ini:
Bungkus wadah Anda dengan
withRouter
dan sampaikan riwayat ke tindakan Anda dalammapDispatchToProps
fungsi. Dalam aksi gunakan history.push ('/ url') untuk bernavigasi.Tindakan:
Wadah:
Ini berlaku untuk Bereaksi Router v4.x .
sumber
import { createBrowserHistory } from 'history'
ada ide tolong?this.context.history.push
tidak akan bekerja.Saya berhasil mendapatkan kerja dorong seperti ini:
sumber
Dalam hal ini Anda memberikan properti ke thunk Anda. Jadi, Anda cukup menelepon
Jika ini tidak terjadi, Anda masih dapat meneruskan riwayat dari komponen Anda
sumber
Saya menawarkan satu solusi lagi jika itu bermanfaat untuk orang lain.
Saya memiliki
history.js
file di mana saya memiliki yang berikut ini:Selanjutnya, pada Root saya di mana saya mendefinisikan router saya, saya menggunakan yang berikut ini:
Akhirnya, pada saya
actions.js
mengimpor History dan memanfaatkan pushLaterDengan cara ini, saya dapat mendorong ke tindakan baru setelah panggilan API.
Semoga ini bisa membantu!
sumber
Jika Anda menggunakan Redux, maka saya akan merekomendasikan menggunakan paket npm react-router-redux . Ini memungkinkan Anda untuk mengirim tindakan navigasi toko Redux.
Anda harus membuat toko seperti yang dijelaskan dalam file Readme mereka .
Kasing penggunaan termudah:
Kasus penggunaan kedua dengan Wadah / Komponen:
Wadah:
Komponen:
sumber
next
versi yang masih dalam pengembangan saat ini!Saya bisa mencapai ini dengan menggunakan
bind()
. Saya ingin mengklik tombol diindex.jsx
, memposting beberapa data ke server, mengevaluasi respons, dan mengarahkan kesuccess.jsx
. Begini cara saya mengatasinya ...index.jsx
:request.js
:success.jsx
:Jadi dengan mengikat
this
kepostData
dalamindex.jsx
, saya bisa aksesthis.props.history
direquest.js
... maka saya bisa menggunakan kembali fungsi ini dalam komponen yang berbeda, hanya untuk memastikan aku ingat untuk menyertakanthis.postData = postData.bind(this)
dalamconstructor()
.sumber
Inilah hack saya (ini adalah file level root saya, dengan sedikit redux yang tercampur di sana - meskipun saya tidak menggunakan
react-router-redux
):Saya kemudian dapat menggunakan di
window.appHistory.push()
mana saja saya inginkan (misalnya, di fungsi toko redux saya / thunks / sagas, dll) saya berharap saya hanya bisa menggunakanwindow.customHistory.push()
tetapi untuk beberapa alasanreact-router
sepertinya tidak pernah memperbarui meskipun url berubah. Tapi dengan cara ini sayareact-router
menggunakan instance EXACT . Saya tidak suka meletakkan barang-barang di lingkup global, dan ini adalah salah satu dari beberapa hal yang saya lakukan dengan itu. Tapi ini lebih baik daripada alternatif lain yang pernah saya lihat IMO.sumber
Gunakan Callback. Itu berhasil untuk saya!
Dalam komponen, Anda hanya perlu menambahkan callback
sumber
jadi cara saya melakukannya adalah: - Alih-alih mengarahkan ulang menggunakan
history.push
, saya hanya menggunakanRedirect
komponen darireact-router-dom
Ketika menggunakan komponen ini Anda hanya dapat luluspush=true
, dan itu akan mengurus sisanyasumber
React router V4 sekarang memungkinkan prop sejarah untuk digunakan seperti di bawah ini:
Nilai tersebut kemudian dapat diakses di mana pun prop lokasi tersedia sebagai
state:{value}
bukan komponen.sumber
Anda dapat menggunakannya seperti ini karena saya melakukannya untuk login dan manny hal yang berbeda
sumber
sumber
langkah pertama bungkus aplikasi Anda di Router
Sekarang seluruh Aplikasi saya akan memiliki akses ke BrowserRouter. Langkah kedua saya mengimpor Rute dan kemudian menurunkan alat peraga itu. Mungkin di salah satu file utama Anda.
Sekarang jika saya menjalankan console.log (this.props) di file js komponen saya bahwa saya harus mendapatkan sesuatu yang terlihat seperti ini
Langkah 2 Saya dapat mengakses objek riwayat untuk mengubah lokasi saya
Saya juga hanya seorang mahasiswa coding bootcamp, jadi saya bukan ahli, tapi saya tahu Anda juga bisa menggunakannya
Koreksi saya jika saya salah, tetapi ketika saya mengujinya itu memuat ulang seluruh halaman yang saya pikir mengalahkan seluruh titik menggunakan Bereaksi.
sumber
Buat custom
Router
dengan sendiribrowserHistory
:Selanjutnya, pada Root Anda di mana Anda mendefinisikan Anda
Router
, gunakan yang berikut:Terakhir, impor di
history
mana Anda membutuhkannya dan gunakan:sumber
Jika Anda ingin menggunakan histori sambil meneruskan fungsi sebagai nilai ke prop Component, dengan react-router 4 Anda bisa menghancurkan struktur
history
prop dalam atribut render dari<Route/>
Component dan kemudian menggunakanhistory.push()
Catatan: Agar ini berfungsi, Anda harus membungkus Komponen BrowserRouter React Router di sekitar komponen root Anda (mis. Yang mungkin ada di index.js)
sumber