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

Posted

技术标签:

【中文标题】如何在 Next.js 的活动页面上设置链接组件的样式【英文标题】:How to style Link component when on active page on 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;
       
    
`;

【问题讨论】:

【参考方案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>
  );

【讨论】:

以上是关于如何在 Next.js 的活动页面上设置链接组件的样式的主要内容,如果未能解决你的问题,请参考以下文章

设置 Storybook 以使用 Next.js 链接标签

如何在头组件中使用效果(ReactJS/Next.js)

如何在 next.js 中获取图像宽度/高度?

动态组件查找导致 Next.js 包大小爆炸,如何解决?

当您想使用链接组件时,外部链接在 Next.js 中不起作用

Next.js 使用 getServerSideProps 如何将道具从页面传递到组件?