我有一个关于在活动页面上设置锚点组件样式的问题。
这是我的代码:
import Link from 'next/link';
import styled from 'styled-components';
const NavStyle = styled.nav`
display: flex;
justify-content: space-between;
.nav-link a {
text-decoration: none;
color: white;
padding: 10px;
background-color: #FFCF00;
}
`;
export default function Nav() {
return (
<NavStyle>
<div className="nav-link">
<Link href="/" passHref>
<a>HOME</a>
</Link>
<Link href="/pricing">
<a>PRICING</a>
</Link>
<Link href="/terms">
<a>TERMS</a>
</Link>
<Link href="/login">
<a>LOGIN</a>
</Link>
</div>
<Link href="/">
<a>LOGO</a>
</Link>
</NavStyle>
)
}
我想要的是,当我单击链接并移动到另一个页面时,活动链接(与 URL 匹配)将具有绿色背景。我已经尝试过,但没有任何改变:
const NavStyle = styled.nav`
display: flex;
justify-content: space-between;
.nav-link a {
text-decoration: none;
color: white;
padding: 10px;
background-color: #FFCF00;
&[aria-current] {
background-color: green;
}
}
`;
Next.js 不会将
aria-current
添加到您的活动链接;但是,您可以创建一个自定义 Link
组件来检查当前 pathname
是否与 href
属性相同。
import React from "react";
import Link from "next/link";
import { useRouter } from "next/router";
const NavLink = ({ children, href }) => {
const child = React.Children.only(children);
const router = useRouter();
return (
<Link href={href}>
{React.cloneElement(child, {
"aria-current": router.pathname === href ? "page" : null
})}
</Link>
);
};
export default NavLink;
然后,每当您想要将
Link
添加到活动链接时,您都可以使用此组件代替默认的 aria-current
:
const NavStyle = styled.nav`
display: flex;
justify-content: space-between;
a {
background-color: #353637;
color: #fff;
padding: 1rem;
text-decoration: none;
&[aria-current] {
background-color: #faf9f4;
color: #353637;
}
}
`;
export default function Nav() {
return (
<NavStyle>
<div className="nav-link">
<NavLink href="/">
<a>HOME</a>
</NavLink>
<NavLink href="/pricing">
<a>PRICING</a>
</NavLink>
<NavLink href="/terms">
<a>TERMS</a>
</NavLink>
<NavLink href="/login">
<a>LOGIN</a>
</NavLink>
</div>
<Link href="/">
<a>LOGO</a>
</Link>
</NavStyle>
);
}
如果有人使用 MaterialUI,则可以轻松使用包装盒
路由器来自
const router = useRouter();
,它是 next/router 的一部分
<Box
sx={{
'& a':{
color: router.pathname === '/' ? '#757de8' : 'rgba(0, 0, 0, 0.87)'
}
}}>
<Link href={'/'}> HOME </Link>
</Box>
我找到的这个问题的最佳答案是https://amanexplains.com/using-aria-current-for-nav-links/
请注意,这个问题的第一个答案说使用路径名,但我提供的链接描述了为什么这在某些情况下不起作用(例如,路径无效)。相反,请使用 asPath。
另请注意,据我所知,目前(NextJS 13)仅适用于客户端组件。
这就是我在我的项目中使用 Material Ui 所做的事情
export default function MainAppBar(props: Props) {
const theme = useTheme();
const {navItems} = props
const pathname = usePathname()
.... rest of code
return (
{navItems && <Box sx={{ display: { xs: "none", sm: "block" } }}>
{navItems.map((item, index) => (
<Link
key={index}
href={item["href"]}
passHref
>
<Button
sx={{ color: pathname === item["href"] ? '#ff7' : 'inherit' }}>
{item["text"]}
</Button>
</Link>
))}
</Box>
}
....
);
}
然后我将链接作为道具传递
export const LINKS: { text: string, href: string, icon: JSX.Element }[] = [
{ text: "Home", href: "/", icon: <Home /> },
{ text: "Work", href: "/work", icon: <Star /> },
{ text: "Blogs", href: "/blog", icon: <Checklist /> },
{ text: "Typography", href: "/typography", icon: <Checklist /> },
];
用途:
<MainAppBar navItems={LINKS} />
结果: