React router con modelli diversi per percorsi diversi v. 5
Ciao, ho visto questa domanda e questo è esattamente quello che sto cercando ma non riesco a farlo funzionare. Router React Router V4 con pagine / modelli master
Sto usando la versione 5.2
Il componente dell'app include la navigazione e racchiude due percorsi con due componenti del modello, "Pubblico" e "Privato" e quando faccio clic su ogni collegamento mi aspetto che la pagina venga racchiusa dal suo modello, ma invece solo il primo collegamento funziona e mostra il modello. Il secondo collegamento cambia solo l'URL nella barra degli indirizzi del browser e solo il contenuto del primo modello rimane sulla pagina e il contenuto della seconda pagina non viene visualizzato. Se cambio l'ordine dei collegamenti sempre solo il collegamento superiore ottiene il modello corretto.
Qui è dove definisco i percorsi e i collegamenti ad essi.
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;
I miei modelli privati e pubblici sono gli stessi tranne che per i titoli uno dice privato e l'altro pubblico.
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;
Ho cercato qualcosa di simile per un po 'perché sembra una soluzione potenzialmente accurata. Se qualcuno sa come risolvere questo problema, lo apprezzerei davvero. Grazie
Risposte
Ecco cosa Switch
fa 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;
}
});
come vedi il Switch
componente si preoccupa solo del primo livello dei suoi figli e cerca un oggetto di scena chiamato path or from
in quello. se non lo trova assume che ogni path
corrisponderà. quindi mostra sempre i primi figli, non importa cosa.
quello che devi fare è cambiare l'ordine dei bambini in questo modo:
<Switch>
<Route exact path="/">
<Public>
<Home />
</Public>
</Route>
<Route path="/members">
<Private>
<Members />
</Private>
</Route>
</Switch>