¿Enlace activo con React-Router?

86

Estoy probando React-Router (v4) y tengo problemas para iniciar el Nav para tener uno de los Linkmejores active. Si hago clic en cualquiera de las Linketiquetas, las cosas activas comienzan a funcionar. Sin embargo, me gustaría que Home Linkesté activo tan pronto como se inicie la aplicación, ya que ese es el componente que se carga en la /ruta. ¿Hay alguna forma de hacer esto?

Aquí está mi código actual:

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
fuente

Respuestas:

206

<Link>ya no tiene las propiedades activeClassNameo activeStyle. En react-router v4, debe usar <NavLink>si desea hacer un estilo condicional:

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

Agregué una propiedad exacta a la casa <NavLink>, estoy bastante seguro de que sin ella, el enlace de la casa siempre estaría activo ya /que coincidiría con /aboutcualquier otra página que tenga.

trabajo
fuente
2
Pasé por alto esta respuesta hoy porque pensé que usar NavLink estaba evitando el problema a primera vista. Es difícil encontrar otro lugar que explique esto. La gente necesita votar esta respuesta porque él tiene toda la razón. tienes que usar NavLink. ¡ADEMÁS! el exact = {true} también es exactamente correcto. De lo contrario, el primer enlace que se renderiza no volverá a renderizarse cuando haga clic en otros enlaces, lo que hará que la casa esté siempre activa. Ojalá pudiera votarte 10 veces más.
wuno
4
Solo una nota rápida, si está usando React con Redux, debe seguir este github.com/ReactTraining/react-router/blob/master/packages/…
Petr Adam
1
En el caso de rutas anidadas, es posible que deba usar exactpara el NavLinktambién.
Wiktor Czajkowski
1
Gracias por ese enlace, @PetrAdam, ¡me preguntaba por qué esto no funcionaba! (la solución es envolver la connectllamada con withRouter).
Brian Burns
1
Para evitar que redux bloquee una repetición, puede proporcionar la opción pure: falseal connect()método. Más información sobre una vista que no se actualiza: https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.md
Pateta