Reaguj router z różnymi szablonami dla różnych tras v.5

Jan 18 2021

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

1 TaghiKhavari Jan 18 2021 at 18:15

Oto, co Switchrobi 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, Switchkomponent 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 pathbę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>