Pertimbangkan hal berikut:
var AppRoutes = [
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Page} />
</Route>,
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Header} >
<Route path="/withheader" handler={Page} />
</Route>
</Route>,
<Route handler={App} someProp="defaultProp">
<Route path=":area" handler={Area} />
<Route path=":area/:city" handler={Area} />
<Route path=":area/:city/:locale" handler={Area} />
<Route path=":area/:city/:locale/:type" handler={Area} />
</Route>
];
Saya memiliki Templat Aplikasi, HeaderTemplate, dan kumpulan rute Parameterized dengan penangan yang sama (dalam template Aplikasi). Saya ingin bisa melayani 404 rute ketika sesuatu tidak ditemukan. Misalnya, / CA / SanFrancisco harus ditemukan dan ditangani berdasarkan Area, sedangkan / SanFranciscoz harus 404.
Inilah cara saya menguji rute dengan cepat.
['', '/', '/withheader', '/SanFranciscoz', '/ca', '/CA', '/CA/SanFrancisco', '/CA/SanFrancisco/LowerHaight', '/CA/SanFrancisco/LowerHaight/condo'].forEach(function(path){
Router.run(AppRoutes, path, function(Handler, state){
var output = React.renderToString(<Handler/>);
console.log(output, '\n');
});
});
Masalahnya adalah / SanFranciscoz selalu ditangani oleh halaman Area, tetapi saya menginginkannya ke 404. Juga, jika saya menambahkan NotFoundRoute ke konfigurasi rute pertama, semua halaman Area 404.
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Page} />
<NotFoundRoute handler={NotFound} />
</Route>,
Apa yang saya lakukan salah?
Berikut adalah inti yang dapat diunduh dan diujicobakan.
react-router
4m1r
sumber
sumber
Jawaban:
DefaultRoute dan NotFoundRoute telah dihapus di react-router 1.0.0.
Saya ingin menekankan bahwa rute default dengan tanda bintang harus yang terakhir di tingkat hierarki saat ini agar berfungsi. Jika tidak, ini akan menimpa semua rute lain yang muncul setelahnya di pohon karena ini pertama dan cocok dengan setiap jalur.
Untuk react-router 1, 2 dan 3
Jika Anda ingin menampilkan 404 dan mempertahankan jalur (Fungsionalitas yang sama seperti NotFoundRoute)
Jika Anda ingin menampilkan halaman 404 tetapi mengubah url (Fungsionalitas yang sama seperti DefaultRoute)
Contoh dengan banyak tingkatan:
Untuk react-router 4 dan 5
Pertahankan jalannya
Alihkan ke rute lain (ubah url)
Urutan penting!
sumber
<Redirect from='*' to='/home' />
dalam sintaks ini:const routes = { component: Main, childRoutes: [ { path: '/', component: Home }, ], indexRoute: { component: Main, }, };
<Route render={(props)=> <MyComponent myProp={someVar} {...props} />} />
Dalam versi react-router yang lebih baru, Anda ingin menggabungkan rute di Switch yang hanya menampilkan komponen pertama yang cocok. Jika tidak, Anda akan melihat beberapa komponen dirender.
Sebagai contoh:
sumber
path="*"
di Rute NotFound. Menghilangkanpath
akan menyebabkan Rute selalu cocok.path
rute yang tidak diketahui seluruhnyaDengan versi baru React Router (sekarang menggunakan 2.0.1), Anda dapat menggunakan tanda bintang sebagai jalur untuk merutekan semua 'jalur lain'.
Jadi akan terlihat seperti ini:
sumber
Jawaban ini untuk react-router-4. Anda dapat menggabungkan semua rute dalam blok Switch, yang berfungsi seperti ekspresi kasus sakelar, dan membuat komponen dengan rute pertama yang cocok. misalnya)
Kapan digunakan
exact
Tanpa tepat:
Dengan tepat:
Sekarang jika Anda menerima parameter perutean, dan jika ternyata salah, Anda dapat menanganinya di komponen target itu sendiri. misalnya)
Sekarang di ProfilePage.js
Untuk lebih jelasnya Anda bisa melalui kode ini:
App.js
ProfilePage.js
sumber
Menurut dokumentasi , rute itu ditemukan, meskipun sumber daya itu tidak.
Jadi, Anda selalu dapat menambahkan baris di
Router.run()
beforeReact.render()
untuk memeriksa apakah sumber daya valid. Cukup teruskan prop ke komponen atau gantiHandler
komponen dengan yang khusus untuk menampilkan tampilan NotFound.sumber
<Route path="*" to="/dest" />
atau<Redirect from="*" to="/dest" />
sebagai sub rute terakhir yang cocok, saya yakinSaya baru saja melihat sekilas contoh Anda, tetapi jika saya memahaminya dengan cara yang benar, Anda mencoba menambahkan rute 404 ke segmen dinamis. Saya mengalami masalah yang sama beberapa hari yang lalu, menemukan # 458 dan # 1103 dan berakhir dengan pemeriksaan tangan dalam fungsi render:
semoga membantu!
sumber