React Router v7 已发布。 查看文档
NavLink
本页内容

<NavLink>

使用额外的属性包装 <Link>,用于设置活动和待处理状态的样式。

import { NavLink } from "@remix-run/react";

<NavLink
  to="/messages"
  className={({ isActive, isPending }) =>
    isPending ? "pending" : isActive ? "active" : ""
  }
>
  Messages
</NavLink>;

自动属性

.active

<NavLink> 组件处于活动状态时,会添加一个 active 类,因此可以使用 CSS 来设置其样式。

<NavLink to="/messages" />
a.active {
  color: red;
}

aria-current

NavLink 处于活动状态时,它会自动将 <a aria-current="page"> 应用于底层的锚标记。请参阅 MDN 上的 aria-current

.pending

<NavLink> 组件在导航期间处于待处理状态时,会添加一个 pending 类,因此可以使用 CSS 来设置其样式。

<NavLink to="/messages" />
a.pending {
  color: red;
}

.transitioning

<NavLink viewTransition> 组件在导航期间处于过渡状态时,会添加一个 transitioning 类,因此可以使用 CSS 来设置其样式。

<NavLink to="/messages" viewTransition />
a.transitioning {
  view-transition-name: my-transition;
}

属性

className 回调

使用激活和待处理状态进行回调,以允许自定义应用的类名。

<NavLink
  to="/messages"
  className={({ isActive, isPending }) =>
    isPending ? "pending" : isActive ? "active" : ""
  }
>
  Messages
</NavLink>

style 回调

使用激活和待处理状态进行回调,以允许自定义应用的样式。

<NavLink
  to="/messages"
  style={({ isActive, isPending }) => {
    return {
      fontWeight: isActive ? "bold" : "",
      color: isPending ? "red" : "black",
    };
  }}
>
  Messages
</NavLink>

children 回调

使用激活和待处理状态进行回调,以允许自定义 <NavLink> 的内容。

<NavLink to="/tasks">
  {({ isActive, isPending }) => (
    <span className={isActive ? "active" : ""}>Tasks</span>
  )}
</NavLink>

end

end 属性更改了 activepending 状态的匹配逻辑,使其仅匹配 NavLinksto 路径的“结尾”。如果 URL 比 to 长,则不再被视为处于活动状态。

链接 URL isActive (是否激活)
<NavLink to="/tasks" /> /tasks true (是)
<NavLink to="/tasks" /> /tasks/123 true (是)
<NavLink to="/tasks" end /> /tasks true (是)
<NavLink to="/tasks" end /> /tasks/123 false (否)

<NavLink to="/"> 是一个特殊情况,因为每个 URL 都匹配 /。为了避免默认匹配每个路由,它实际上会忽略 end 属性,并且仅当您位于根路由时才匹配。

caseSensitive

添加 caseSensitive 属性会更改匹配逻辑,使其区分大小写。

链接 URL isActive (是否激活)
<NavLink to="/SpOnGe-bOB" /> /sponge-bob true (是)
<NavLink to="/SpOnGe-bOB" caseSensitive /> /sponge-bob false (否)

viewTransition

viewTransition 属性通过将最终状态更新包裹在 document.startViewTransition() 中,为此导航启用视图转换。默认情况下,在转换过程中,会将一个 transitioning添加到 <a> 元素,你可以使用它来自定义视图转换。

a.transitioning p {
  view-transition-name: "image-title";
}

a.transitioning img {
  view-transition-name: "image-expand";
}
<NavLink to={to} viewTransition>
  <p>Image Number {idx}</p>
  <img src={src} alt={`Img ${idx}`} />
</NavLink>

你还可以使用 className/style 属性或传递给 children 的渲染属性,以根据 isTransitioning 值进一步进行自定义。

<NavLink to={to} viewTransition>
  {({ isTransitioning }) => (
    <>
      <p
        style={{
          viewTransitionName: isTransitioning
            ? "image-title"
            : "",
        }}
      >
        Image Number {idx}
      </p>
      <img
        src={src}
        alt={`Img ${idx}`}
        style={{
          viewTransitionName: isTransitioning
            ? "image-expand"
            : "",
        }}
      />
    </>
  )}
</NavLink>

支持 <Link> 的所有其他属性。

文档和示例根据以下许可证授权 MIT