reactjs 如何使用react在锚链接上设置活动类

dbf7pr2w  于 2023-01-12  发布在  React
关注(0)|答案(2)|浏览(139)

我正在我的项目上使用react。但是我如何使用state处理多个元素上的click事件。在click时所有元素都有相同的类。下面是一个片段:

const anchors = [
     {
       id: 1,
       name: "Дансны үйлчилгээ",
       key: "account-service",
     },
     {
       id: 2,
       name: "Зээлийн үйлчилгээ",
       key: "loan-service",
     },
     {
       id: 3,
       name: "Картын үйлчилгээ",
       key: "card-service",
     },
     {
       id: 4,
       name: "Даатгалын зуучлалын үйлчилгээ",
       key: "insurance-service",
     },
     {
       id: 5,
       name: "Цахим банкны үйлчилгээ",
       key: "bank-service",
     },
     {
       id: 6,
       name: "Mэдээлэл шинэчлэх",
       key: "profile-service",
     },
   ];

循环数组:

<div className="positions">
    {anchors.map((anchor: any) => {
         return (
          <a
             href={"#" + anchor.key}
             key={anchor.id}
             className={active ? "selected" : ""}
             onClick={(event: any) => handleClick(event)}
          >
             <img src="/images/arrow-right.svg" />
             <span>{anchor.name}</span>
          </a>
        );
    })}
</div>

我的重点是

const [active, setActive] = useState<boolean>(false);

处理事件:

function handleClick(e: any) {
     if (e.currentTarget) setActive(!active);
     else return;
     e.stopPropagation();
  }

我想要的是,当我点击锚时,它应该是active类。但是我卡住了。我实际上不能得到当前元素,它应该是活动的。

gojuced7

gojuced71#

更改active状态以记录id而不是布尔值

const [active, setActive] = useState<number | undefined>();

然后使用

<a
  href={"#" + anchor.key}
  key={anchor.id}
  className={anchor.id === active ? "selected" : ""}
  onClick={(e) => handleClick(e, anchor.id)}
>

以及

function handleClick(e: React.MouseEvent<HTMLAnchorElement>, id: number) {
  e.stopPropagation()
  setActive(id)
}

owfi6suc

owfi6suc2#

首先,我建议对像这样小的东西使用任何种类的“状态”。
例如,您可以通过在Next.js中执行以下操作轻松获得active的布尔值(它基本上具有与react相同的路由器API):

const isCurrent: boolean = router.asPath == props.href;

然后,您可以基于这个布尔值添加一个“active”类,或者执行其他操作,例如禁用link元素。
最简单的方法来让这个工作在一个干的方式是通过为您的链接这样一个 Package 器:

const NavBarLink = (props: { title: string; href: string }) => {
    const isCurrent: boolean = router.asPath == props.href;
    return (
      <Link
        href={props.href ? props.href : "/"}
        className={
          "block rounded py-0 pl-2 pr-2 hover:bg-gray-100 hover:text-gray-900" +
          (isCurrent ? " bg-gray-100 text-gray-900" : " text-white")
        }
        aria-current="page"
        aria-disabled={isCurrent}
        onClick={(e) => {
          if (isCurrent) {
            e.preventDefault();
          }
        }}
      >
        {props.title ? props.title : "--"}
      </Link>
    );
  };

相关问题