Obecnie mam problemy z zagnieżdżaniem tras przy użyciu routera reagującego v4.
Najbliższym przykładem była konfiguracja trasy w dokumentacji React-Router v4 .
Chcę podzielić moją aplikację na 2 różne części.
Frontend i obszar administracyjny.
Myślałem o czymś takim:
<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 ma inny układ i styl niż obszar administracyjny. Tak więc na pierwszej stronie trasy do domu, a więc i tak powinny być trasy podrzędne.
/ home powinien być renderowany w komponencie Frontpage, a / admin / home powinien być renderowany w komponencie Backend.
Próbowałem pewnych wariantów, ale zawsze kończyłem się nie trafieniem / home lub / admin / home.
Edycja - 19.04.2017
Ponieważ ten post ma teraz wiele wyświetleń, zaktualizowałem go o ostateczne rozwiązanie. Mam nadzieję, że to komuś pomoże.
Edycja - 08.05.2017
Usunięto stare rozwiązania
Ostateczne rozwiązanie:
To jest ostateczne rozwiązanie, którego używam teraz. Ten przykład zawiera również globalny komponent błędu, taki jak tradycyjna strona 404.
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
logiki.Odpowiedzi:
W React-Router-v4 nie zagnieżdżasz się
<Routes />
. Zamiast tego umieścisz je w innym<Component />
.Na przykład
powinno stać się
z
Oto podstawowy przykład prosto z dokumentacji routera reagującego .
źródło
to="exampleTopicId"
z${match.url}
bycia niejawny.react-router v6
Aktualizacja do 2020 roku: nadchodzące wydanie v6 będzie zawierać zagnieżdżone
Route
komponenty, które Just Work ™. Zobacz przykładowy kod w tym poście na blogu .Chociaż pierwotne pytanie dotyczy wersji v4 / v5 , właściwa odpowiedź, gdy statki w wersji v6 będą po prostu jej używać, jeśli możesz . Obecnie jest w wersji alfa.
react-router v4 & v5
Prawdą jest, że aby zagnieździć Trasy, musisz umieścić je w podrzędnym komponencie Trasy.
Jeśli jednak wolisz składnię bardziej wbudowaną niż rozbijanie tras między komponenty, możesz dostarczyć funkcjonalny komponent do
render
rekwizytu trasy, pod którą chcesz zagnieździć.Jeśli interesuje Cię, dlaczego
render
rekwizyt powinien być użyty, a niecomponent
rekwizyt, dzieje się tak dlatego, że zapobiega on ponownemu zamontowaniu wbudowanego komponentu funkcjonalnego na każdym renderowaniu. Więcej informacji znajduje się w dokumentacji .Zauważ, że przykład otacza zagnieżdżone trasy we fragmencie . Przed React 16 możesz
<div>
zamiast tego użyć kontenera .źródło
match.path
, niematch.url
. Ten pierwszy jest zwykle używany wpath
rekwizytach trasy ; ten ostatni, kiedy przepychasz nową trasę (np. Linkto
prop)Chciałem tylko wspomnieć, że router- reakcyjny v4 zmienił się radykalnie od czasu wysłania / odpowiedzi na to pytanie.
Nie ma
<Match>
komponentu!<Switch>
jest upewnienie się, że renderowane jest tylko pierwsze dopasowanie.<Redirect>
no .. przekierowuje na inną trasę. Użyj lub pomiń,exact
aby włączyć lub wyłączyć dopasowanie częściowe.Zobacz dokumenty. Oni są świetni. https://reacttraining.com/react-router/
Oto przykład, mam nadzieję, że będzie użyteczny, aby odpowiedzieć na twoje pytanie.
Mam nadzieję, że to pomogło, daj mi znać. Jeśli ten przykład nie odpowiada wystarczająco dobrze na twoje pytanie, powiedz mi, a zobaczę, czy mogę je zmodyfikować.
źródło
exact
naRedirect
reagtraining.com/react-router/web/api/Redirect To byłoby o wiele czystsze niż<Route exact path="/" render={() => <Redirect to="/path" />} />
to, co robię zamiast tego. Przynajmniej nie pozwoli mi to na TypeScript.Coś takiego.
źródło
Udało mi się zdefiniować zagnieżdżone trasy przez zawinięcie
Switch
i zdefiniowanie zagnieżdżonej trasy przed trasą główną.Odniesienie: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
źródło
Możesz spróbować czegoś takiego jak Routes.js
App.js
Myślę, że możesz to samo osiągnąć również tutaj.
źródło
źródło