Aktywne łącze z React-Router?

86

Wypróbowuję React-Router (v4) i mam problemy z uruchomieniem Nav, aby mieć jedną z Linknich active. Jeśli kliknę którykolwiek z Linktagów, aktywne rzeczy zaczną działać. Chciałbym jednak, aby Strona główna Linkbyła aktywna zaraz po uruchomieniu aplikacji, ponieważ jest to komponent ładujący się na /trasie. Czy jest na to sposób?

Oto mój obecny kod:

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClassName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClassName='is-active' to='/about'>About</Link>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)
Saad
źródło

Odpowiedzi:

206

<Link>nie ma już właściwości activeClassNamelub activeStyle. W React-router v4 musisz użyć, <NavLink>jeśli chcesz używać stylów warunkowych:

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact={true} activeClassName='is-active' to='/'>Home</NavLink>
        <NavLink activeClassName='is-active' to='/about'>About</NavLink>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

Dodałem dokładną właściwość do domu <NavLink>, jestem prawie pewien, że bez niego link do strony głównej byłby zawsze aktywny, ponieważ /pasowałby /aboutdo wszystkich innych stron, które masz.

worc
źródło
2
Przeoczyłem dzisiaj tę odpowiedź, ponieważ myślałem, że używanie NavLink pozwala na pierwszy rzut oka uniknąć problemu. Trudno znaleźć inne miejsce, które by to wyjaśniało. Ludzie muszą głosować za tą odpowiedzią, ponieważ ma on całkowitą rację. musisz użyć NavLink. RÓWNIEŻ! dokładne = {true} też jest dokładnie poprawne. W przeciwnym razie pierwszy renderowany link nie zostanie ponownie wyrenderowany po kliknięciu innych linków, dzięki czemu strona główna będzie zawsze aktywna. Chciałbym móc zagłosować za Ciebie jeszcze 10 razy.
wuno
4
Krótka
Petr Adam
1
W przypadku zagnieżdżonych trasach, może trzeba użyć exactdla NavLinkzbyt.
Wiktor Czajkowski
1
Dziękuję za ten link, @PetrAdam - zastanawiałeś się, dlaczego to nie działa! (rozwiązaniem jest zawinięcie connectpołączenia withRouter).
Brian Burns
1
Aby uniknąć blokowania ponownego renderowania przez redux, można udostępnić pure: falseconnect()metodę. Więcej informacji o widoku, który nie jest aktualizowany: https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.md
Pateta