React router con modelli diversi per percorsi diversi v. 5

Jan 18 2021

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

1 TaghiKhavari Jan 18 2021 at 18:15

Ecco cosa Switchfa 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 Switchcomponente si preoccupa solo del primo livello dei suoi figli e cerca un oggetto di scena chiamato path or fromin quello. se non lo trova assume che ogni pathcorrisponderà. 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>