Roteador React com modelos diferentes para rotas diferentes v. 5
Olá, eu vi esta pergunta e é exatamente isso que estou procurando, mas não consigo fazer funcionar. Roteador React Roteadores V4 com páginas mestras / modelos
Estou usando a versão 5.2
O componente do aplicativo inclui a navegação e envolve dois caminhos com dois componentes de modelo, 'Público' e 'Privado' e quando clico em cada link, espero que a página seja envolvida por seu modelo, mas apenas o primeiro link funciona e mostra o modelo. O segundo link altera apenas o url na barra de endereço do navegador e apenas o conteúdo do primeiro modelo permanece na página e o conteúdo da segunda página não é mostrado. Se eu alterar a ordem dos links, sempre apenas o link do topo obtém o modelo correto.
É aqui que eu defino as rotas e links para eles.
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;
Meus modelos privado e público são os mesmos, exceto pelos títulos que um diz privado e o outro público.
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;
Eu tenho procurado por algo assim por um tempo, pois parece uma solução potencialmente legal. Se alguém souber como consertar isso eu realmente apreciaria. Obrigado
Respostas
Aqui está o que o Switch
Component faz:
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;
}
});
como você pode ver, o Switch
componente só se preocupa com o primeiro nível de seus filhos e procura um suporte chamado nele path or from
. se não o encontrar, presume que todos path
irão corresponder. por isso sempre mostra os primeiros filhos, aconteça o que acontecer.
o que você precisa fazer é mudar a ordem dos filhos assim:
<Switch>
<Route exact path="/">
<Public>
<Home />
</Public>
</Route>
<Route path="/members">
<Private>
<Members />
</Private>
</Route>
</Switch>