javascript - ¿Enlace activo con React-Router?
Estoy probando React-Router (v4) y estoy teniendo problemas para que al iniciar la navegación uno de los Link esté activo. Si hago clic en cualquiera de las etiquetas Link, entonces la funcionalidad de activo empieza a funcionar. Sin embargo, me gustaría que el Link de Inicio estuviera activo tan pronto como la aplicación se inicia, ya que ese es el componente que se carga en la ruta /. ¿Hay alguna manera 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>
)
Respuesta #1
Esta es una respuesta antigua y desactualizada para React Router v4
<Link> ya no tiene las propiedades activeClassName o activeStyle. En react-router v4 tienes que usar <NavLink> si quieres hacer estilos condicionales:
const Router = () => (
<BrowserRouter>
<div>
<Nav>
<NavLink exact 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 al <NavLink> de inicio, estoy bastante seguro de que sin ella, el enlace de inicio siempre estaría activo ya que / coincidiría con /about y cualquier otra página que tengas.
Respuesta #2
React Router v6:
Fuente: Clases de NavLink Activas con React Router
Ahora puedes usar la propiedad className que ahora acepta una función y pasa una propiedad booleana isActive, así:
<NavLink
to="users"
className={({ isActive }) => (isActive ? 'active' : 'inactive')}
>
Users
</NavLink>
También puedes agregar varias clases, ya que v6 está disponible:
<NavLink
to="users"
className={({ isActive }) =>
isActive ? 'bg-green-500 font-bold' : 'bg-red-500 font-thin'
}
>
Users
</NavLink>
Demostración en vivo: Clases NavLink activas con React Router
Respuesta #3
import { NavLink, useMatch, useResolvedPath } from 'react-router-dom';
const CustomNavLink = ({ to, title }) => {
let resolved = useResolvedPath(to);
let match = useMatch({ path: resolved.pathname, end: true });
return (
<NavLink to={to} className={`d-flex align-items-center py-2 px-4 ${match ? 'cta-btn' : 'c-n-b-link'}`} >
<span className='ms-1 f-w-600'>{title}</span>
</NavLink>
)
}
Para React router V6, el componente personalizado anterior devolverá un navlink al que se le puede activar una clase activa siempre que la ruta coincida con la ruta to dada.
