Активне посилання з React-Router?


85

Я випробовую 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>
)

Відповіді:


205

<Link>більше не має властивостей activeClassNameабо activeStyle. У React-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будь-якими іншими вашими сторінками.


2
Сьогодні я пропустив цю відповідь, оскільки думав, що використання NavLink дозволяє уникнути проблеми на перший погляд. Важко знайти де-небудь ще, що пояснює це. Люди повинні підтримати цю відповідь, тому що він абсолютно правий. вам потрібно використовувати NavLink. ТАКОЖ! точно = {true} теж точно. В іншому випадку перше посилання, яке відображається, не відображатиметься, коли ви натискаєте інші посилання, через що будинок завжди буде активним. Я би хотів, щоб я проголосував за вас ще 10 разів.
wuno

4
Лише коротке зауваження, якщо ви використовуєте React with Redux, вам потрібно дотримуватися цього github.com/ReactTraining/react-router/blob/master/packages/…
Петр Адам

1
У разі вкладених маршрутів, можливо, вам доведеться використовувати і exactдля них NavLink.
Віктор Чайковський,

1
Дякую за це посилання, @PetrAdam - дивувався, чому це не працює! (рішення полягає в завершенні connectдзвінка withRouter).
Брайан Бернс,

1
Щоб уникнути перевождь блокування повторної візуалізації ви можете надати можливість pure: falseдо connect()методу. Більше інформації про подання, яке не оновлюється: https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.md
Pateta,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.