Reaguj router z różnymi szablonami dla różnych tras v.5
Cześć, widziałem to pytanie i właśnie tego szukam, ale nie mogę go uruchomić. Reaguj routery routera V4 za pomocą stron / szablonów wzorcowych
Używam wersji 5.2
Komponent aplikacji zawiera nawigację i otacza dwie ścieżki dwoma komponentami szablonu, „Publicznym” i „Prywatnym”, a kiedy klikam każde łącze, oczekuję, że strona zostanie opakowana w jego szablon, ale zamiast tego tylko pierwsze łącze działa i pokazuje szablon. Drugi link zmienia tylko adres URL w pasku adresu przeglądarki i tylko zawartość pierwszego szablonu pozostaje na stronie, a zawartość drugiej strony nie jest wyświetlana. Jeśli zmienię kolejność linków, zawsze tylko górny link otrzyma właściwy szablon.
Tutaj definiuję trasy i linki do nich.
class App extends Component {
render() {
return (
<Router>
<div>
<ul><li><Link to="/">Home</Link></li>
<li><Link to="/members">Members</Link></li>
</ul>
</div>
<Switch>
<Public>
<Route exact path="/"><Home /></Route>
</Public>
<Private>
<Route path="/members"><Members /></Route>
</Private>
</Switch>
</Router>
);
}
}
export default App;
Moje szablony prywatne i publiczne są takie same, z wyjątkiem tytułów, które jeden mówi, że jest prywatny, a drugi publiczny.
class Private extends Component {
render() {
return (
<div className="container">
<div className="row">
<div className="col-md-2"><h2>PRIVATE</h2></div>
<div className="col-md-8">{this.props.children}</div>
<div className="col-md-2"></div>
</div>
</div>
);
}
}
export default Private;
Szukałem czegoś takiego od jakiegoś czasu, ponieważ wygląda to na potencjalnie zgrabne rozwiązanie. Jeśli ktoś wie, jak to naprawić, byłbym naprawdę wdzięczny. Dzięki
Odpowiedzi
Oto, co Switch
robi Component:
React.Children.forEach(this.props.children, child => {
if (match == null && React.isValidElement(child)) {
element = child;
const path = child.props.path || child.props.from;
match = path
? matchPath(location.pathname, { ...child.props, path })
: context.match;
}
});
jak widzisz, Switch
komponent dba tylko o pierwszy poziom swoich dzieci i szuka rekwizytu o nazwie path or from
. jeśli go nie znajdzie, zakłada, że każdy path
będzie pasował. więc zawsze pokazuje pierwsze dzieci bez względu na wszystko.
co musisz zrobić, to zmienić kolejność dzieci w następujący sposób:
<Switch>
<Route exact path="/">
<Public>
<Home />
</Public>
</Route>
<Route path="/members">
<Private>
<Members />
</Private>
</Route>
</Switch>