【问题标题】:How to style Link component when on active page on Next.js如何在 Next.js 的活动页面上设置链接组件的样式
【发布时间】:2021-05-09 16:46:02
【问题描述】:

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

这是我的代码:

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


    【解决方案1】:

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

    然后,当您想将aria-current 添加到活动链接时,您可以使用此组件而不是默认的Link:

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

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2021-08-04
      • 2017-06-22
      • 2012-10-01
      • 2012-01-18
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多