Saat ini saya berjuang dengan rute bersarang menggunakan router reaksi v4.
Contoh terdekat adalah konfigurasi rute dalam Dokumentasi React-Router v4 .
Saya ingin membagi aplikasi menjadi 2 bagian berbeda.
Frontend dan area admin.
Saya sedang memikirkan sesuatu seperti ini:
<Match pattern="/" component={Frontpage}>
<Match pattern="/home" component={HomePage} />
<Match pattern="/about" component={AboutPage} />
</Match>
<Match pattern="/admin" component={Backend}>
<Match pattern="/home" component={Dashboard} />
<Match pattern="/users" component={UserPage} />
</Match>
<Miss component={NotFoundPage} />
Frontend memiliki tata letak dan gaya yang berbeda dari area admin. Jadi di dalam halaman depan rute pulang, sekitar dan jadi orang harus menjadi rute anak.
/ home harus dirender ke dalam komponen Frontpage dan / admin / home harus di-render dalam komponen Backend.
Saya mencoba beberapa variasi tetapi saya selalu berakhir dengan tidak memukul / home atau / admin / home.
Edit - 19.04.2017
Karena posting ini memiliki banyak pandangan sekarang saya memperbaruinya dengan solusi akhir. Saya harap ini membantu seseorang.
Edit - 08.05.2017
Solusi lama yang dihapus
Solusi akhir:
Ini adalah solusi terakhir yang saya gunakan saat ini. Contoh ini juga memiliki komponen kesalahan global seperti halaman 404 tradisional.
import React, { Component } from 'react';
import { Switch, Route, Redirect, Link } from 'react-router-dom';
const Home = () => <div><h1>Home</h1></div>;
const User = () => <div><h1>User</h1></div>;
const Error = () => <div><h1>Error</h1></div>
const Frontend = props => {
console.log('Frontend');
return (
<div>
<h2>Frontend</h2>
<p><Link to="/">Root</Link></p>
<p><Link to="/user">User</Link></p>
<p><Link to="/admin">Backend</Link></p>
<p><Link to="/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
const Backend = props => {
console.log('Backend');
return (
<div>
<h2>Backend</h2>
<p><Link to="/admin">Root</Link></p>
<p><Link to="/admin/user">User</Link></p>
<p><Link to="/">Frontend</Link></p>
<p><Link to="/admin/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/admin' component={Home}/>
<Route path='/admin/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
class GlobalErrorSwitch extends Component {
previousLocation = this.props.location
componentWillUpdate(nextProps) {
const { location } = this.props;
if (nextProps.history.action !== 'POP'
&& (!location.state || !location.state.error)) {
this.previousLocation = this.props.location
};
}
render() {
const { location } = this.props;
const isError = !!(
location.state &&
location.state.error &&
this.previousLocation !== location // not initial render
)
return (
<div>
{
isError
? <Route component={Error} />
: <Switch location={isError ? this.previousLocation : location}>
<Route path="/admin" component={Backend} />
<Route path="/" component={Frontend} />
</Switch>}
</div>
)
}
}
class App extends Component {
render() {
return <Route component={GlobalErrorSwitch} />
}
}
export default App;
previousLocation
logika.Jawaban:
Di react-router-v4 Anda tidak bersarang
<Routes />
. Sebaliknya, Anda menempatkan mereka di dalam yang lain<Component />
.Misalnya
harus menjadi
dengan
Berikut ini adalah contoh dasar langsung dari dokumentasi router reaksi .
sumber
to="exampleTopicId"
dengan${match.url}
yang tersirat.react-router v6
Pembaruan untuk 2020: Rilis v6 yang akan datang akan memiliki
Route
komponen bersarang yang Just Work ™. Lihat contoh kode di posting blog ini .Sementara pertanyaan aslinya adalah tentang v4 / v5 , jawaban yang tepat ketika v6 dikirimkan hanya akan digunakan jika Anda bisa . Saat ini dalam alpha.
react-router v4 & v5
Memang benar bahwa untuk membuat Rute, Anda perlu menempatkannya di komponen turunan dari Rute.
Namun, jika Anda lebih memilih sintaks sebaris daripada memecah Rute Anda di seluruh komponen, Anda dapat memberikan komponen fungsional untuk
render
penyangga Rute yang ingin Anda masukkan .Jika Anda tertarik mengapa
render
prop harus digunakan, dan bukancomponent
prop, itu karena menghentikan komponen fungsional sebaris yang di-remount pada setiap render. Lihat dokumentasi untuk lebih detail.Perhatikan bahwa contoh membungkus Routes bersarang di Fragmen . Sebelum Bereaksi 16, Anda bisa menggunakan wadah
<div>
.sumber
match.path
, bukanmatch.url
. Yang pertama biasanya digunakan dalampath
penyangga Rute ; yang terakhir ketika Anda mendorong rute baru (mis. Tautanto
prop)Hanya ingin menyebutkan react-router v4 berubah secara radikal sejak pertanyaan ini diposting / dijawab.
Tidak ada
<Match>
komponen lagi!<Switch>
adalah untuk memastikan hanya pertandingan pertama yang diberikan.<Redirect>
yah .. dialihkan ke rute lain. Gunakan atau tinggalkanexact
untuk masuk atau mengecualikan kecocokan sebagian.Lihat dokumen. Mereka itu hebat. https://reacttraining.com/react-router/
Berikut ini contoh yang saya harap bisa digunakan untuk menjawab pertanyaan Anda.
Semoga ini bisa membantu, beri tahu saya. Jika contoh ini tidak menjawab pertanyaan Anda dengan cukup baik, beri tahu saya dan saya akan melihat apakah saya dapat memodifikasinya.
sumber
exact
diRedirect
reacttraining.com/react-router/web/api/Redirect Itu akan jauh lebih bersih daripada<Route exact path="/" render={() => <Redirect to="/path" />} />
yang saya lakukan sebagai gantinya. Setidaknya itu tidak akan membiarkan saya dengan TypeScript.Sesuatu seperti ini.
sumber
Saya berhasil mendefinisikan rute bersarang dengan membungkus dengan
Switch
dan menentukan rute bersarang sebelum dari rute root.Referensi: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
sumber
Anda dapat mencoba sesuatu seperti Routes.js
App.js
Saya pikir Anda dapat mencapai hal yang sama dari sini juga.
sumber
sumber