如何在 Next.js 上的活动页面上设置链接组件的样式

问题描述 投票:0回答:4

我有一个关于在活动页面上设置锚点组件样式的问题。

这是我的代码:

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;
       }
    }
`;
javascript node.js reactjs next.js styled-components
4个回答
9
投票

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

1
投票

如果有人使用 MaterialUI,则可以轻松使用包装盒

路由器来自

const router = useRouter();
,它是 next/router

的一部分
<Box 
   sx={{
       '& a':{
             color: router.pathname === '/' ? '#757de8' : 'rgba(0, 0, 0, 0.87)'
          }
      }}>
  <Link href={'/'}> HOME </Link>
</Box>

0
投票

我找到的这个问题的最佳答案是https://amanexplains.com/using-aria-current-for-nav-links/

请注意,这个问题的第一个答案说使用路径名,但我提供的链接描述了为什么这在某些情况下不起作用(例如,路径无效)。相反,请使用 asPath。

另请注意,据我所知,目前(NextJS 13)仅适用于客户端组件。


0
投票

这就是我在我的项目中使用 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} />

结果:

© www.soinside.com 2019 - 2024. All rights reserved.