Roteador React com modelos diferentes para rotas diferentes v. 5

Jan 18 2021

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

1 TaghiKhavari Jan 18 2021 at 18:15

Aqui está o que o SwitchComponent 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 Switchcomponente 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 pathirã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>