Активная ссылка с React-Router?

86

Я пробую React-Router (v4), и у меня возникают проблемы с запуском Nav, чтобы иметь один из Linkних active. Если я нажимаю на любой из Linkтегов, активный материал начинает работать. Однако я бы хотел, чтобы Home Linkбыл активен сразу после запуска приложения, поскольку это компонент, который загружается на /маршруте. Есть какой-либо способ сделать это?

Вот мой текущий код:

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>
)
Саад
источник

Ответы:

206

<Link>больше не имеет свойств activeClassNameили activeStyle. В response-router v4 вы должны использовать, <NavLink>если хотите использовать условный стиль:

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>
)

Я добавил точное свойство в дом <NavLink>, я почти уверен, что без него ссылка на дом всегда будет активна, поскольку /будет соответствовать /aboutи любым другим страницам, которые у вас есть.

Worc
источник
2
Я пропустил этот ответ сегодня, потому что на первый взгляд думал, что использование NavLink позволяет избежать проблемы. Трудно найти где-нибудь еще, что объясняет это. Люди должны проголосовать за этот ответ, потому что он совершенно прав. вы должны использовать NavLink. ТАКЖЕ! точное = {true} тоже точно. В противном случае первая отображаемая ссылка не будет повторно отображаться при нажатии на другие ссылки, в результате чего главная страница всегда будет активна. Хотел бы я проголосовать за вас еще 10 раз.
wuno
4
Просто небольшое примечание: если вы используете React с Redux, вам нужно следовать этому github.com/ReactTraining/react-router/blob/master/packages/…
Петр Адам
1
В случае вложенных маршрутов вам может потребоваться использовать и exactдля NavLink.
Wiktor Czajkowski
1
Спасибо за эту ссылку, @PetrAdam - интересно, почему это не работает! (решение состоит в том, чтобы обернуть connectвызов withRouter).
Брайан Бернс
1
Чтобы избежать блокировки повторного рендеринга redux, вы можете указать эту опцию pure: falseдля connect()метода. Дополнительная информация о представлении, которое не обновляется: https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.md
Pateta