我正在构建一个Gatsby网站,我有以下网站菜单的HTML结构:
<li className="menu-item current-menu-item">
<Link to="/">Home</Link>
</li>
<li className="menu-item">
<Link to="/contact">Contact</Link>
</li>
如您所见,活动类应用于<li>
标记,而不是<Link>
生成的<a>
标记。在Vue中,我们可以这样做:
<router-link to="/contact" tag="li">
<a href="javascript:void">Contact</a>
</router-link>
tag
道具告诉router-link
元素它应该将该元素呈现为列表项。通过这种方式,活动类被应用于列表项,而不是子<a>
标记。如何使用Gatsby Link获得相同的结果?我似乎在任何地方都找不到答案。非常感谢。
您不希望使用li
而使用a
标记的。您只希望li
在相应的a
标记处于活动状态时显示为活动状态。链接应该是a
标记作为HTML标准。
Gatsby使用reach-router
进行路由,因此在处理路径和路由时,可以使用globalHistory
对象来获得当前路径:
import { globalHistory } from '@reach/router'
然后在组件内部,获取当前路径的pathname
:
const pathname = globalHistory.location.pathname
现在,您所要做的就是根据pathname
:的值有条件地设置每个li
的样式
<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语句中映射它们,而不是单独写出它们:
return (
<ul>
{navLinks.map(link => (
<li className={`menu-item ${pathname === link.to ? 'current-menu-item' : ''} `}>
<Link to={link.to}>{link.label}</Link>
</li>
))}
</ul>
)