Вы не хотите использовать li
вместо тега a
. Вы просто хотите, чтобы li
отображался как активный, когда активен соответствующий тег a
. Ссылки должны быть a
тегами в качестве стандарта HTML.
Гэтсби использует reach-router
для маршрутизации, поэтому при работе с путями и маршрутизацией вы можете использовать объект globalHistory
для получения текущего пути:
import { globalHistory } from '@reach/router'
Затем внутри вашего компонента получите pathname
текущего пути:
const pathname = globalHistory.location.pathname
Теперь все, что вам нужно сделать, это условно установить стиль каждого li
, основываясь на значение pathname
:
<li className={`menu-item ${pathname === "/" ? "current-menu-item" : ""} `}>
<Link to="/">Home</Link>
</li>
<li className={`menu-item ${pathname === "/contact" ? "current-menu-item" : ""} `}>
<Link to="/contact">Contact</Link>
</li>
Может быть проще иметь массив ваших ссылок:
const navLinks = [
{ label: 'Home', to: '/' },
{ label: 'Contact', to: '/contact' },
{ label: 'About', to: '/about' },
]
И затем отобразить их внутри оператора возврата вместо их записи индивидуально:
return (
<ul>
{navLinks.map(link => (
<li className={`menu-item ${pathname === link.to ? 'current-menu-item' : ''} `}>
<Link to={link.to}>{link.label}</Link>
</li>
))}
</ul>
)