<NavLink>
<NavLink> 是一种特殊的 <Link> ,它知道自己是否处于 "激活"、"待定 "或 "过渡 "状态。这在几种不同的情况下都很有用:
- 在创建导航菜单(如面包屑或一组选项卡)时,您希望显示当前选择了哪个选项卡
- 它为屏幕阅读器等辅助技术提供了有用的背景信息
- 它提供了一个 "过渡 "值,可让您对视图转换进行更精细的控制
import { NavLink } from "react-router-dom";
<NavLink
to="/messages"
className={({ isActive, isPending }) =>
isPending ? "pending" : isActive ? "active" : ""
}
>
Messages
</NavLink>;import { NavLink } from "react-router-dom";
<NavLink
to="/messages"
className={({ isActive, isPending }) =>
isPending ? "pending" : isActive ? "active" : ""
}
>
Messages
</NavLink>;默认 active 类
默认情况下,当 <NavLink> 组件处于活动状态时,会为其添加一个 active 类,以便使用 CSS 对其进行样式设置。
<nav id="sidebar">
<NavLink to="/messages" />
</nav><nav id="sidebar">
<NavLink to="/messages" />
</nav>#sidebar a.active {
color: red;
}#sidebar a.active {
color: red;
}className
className 属性的作用与普通 className 类似,但您也可以将函数传递给它,以便根据链接的活动和待定状态自定义应用的 classNames。
<NavLink
to="/messages"
className={({ isActive, isPending, isTransitioning }) =>
[
isPending ? "pending" : "",
isActive ? "active" : "",
isTransitioning ? "transitioning" : "",
].join(" ")
}
>
Messages
</NavLink><NavLink
to="/messages"
className={({ isActive, isPending, isTransitioning }) =>
[
isPending ? "pending" : "",
isActive ? "active" : "",
isTransitioning ? "transitioning" : "",
].join(" ")
}
>
Messages
</NavLink>style
style 属性的工作方式与普通样式属性类似,但您也可以通过一个函数,根据链接的活动和待定状态自定义应用的样式。
<NavLink
to="/messages"
style={({ isActive, isPending, isTransitioning }) => {
return {
fontWeight: isActive ? "bold" : "",
color: isPending ? "red" : "black",
viewTransitionName: isTransitioning ? "slide" : "",
};
}}
>
Messages
</NavLink><NavLink
to="/messages"
style={({ isActive, isPending, isTransitioning }) => {
return {
fontWeight: isActive ? "bold" : "",
color: isPending ? "red" : "black",
viewTransitionName: isTransitioning ? "slide" : "",
};
}}
>
Messages
</NavLink>children
您可以传递一个呈现属性作为子元素,以便根据活动和待定状态自定义 <NavLink> 的内容,这对更改内部元素的样式非常有用。
<NavLink to="/tasks">
{({ isActive, isPending }) => (
<span className={isActive ? "active" : ""}>Tasks</span>
)}
</NavLink><NavLink to="/tasks">
{({ isActive, isPending }) => (
<span className={isActive ? "active" : ""}>Tasks</span>
)}
</NavLink>end
end 属性更改了 active 和 pending 状态的匹配逻辑,使其只匹配到导航链接 to 路径的 "末端"。如果 URL 长于 to ,将不再被视为激活状态。
| Link | Current 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="/tasks/" end /> | /tasks | false |
<NavLink to="/tasks/" end /> | /tasks/ | true |
关于根路由链接的说明
<NavLink to="/"> 是一个特例,因为每个 URL 都匹配/ 。为了避免默认情况下每条路由都匹配,它实际上忽略了 end属性,只在根路由上匹配。
caseSensitive
添加 caseSensitive 属性后,匹配逻辑会发生变化,变得区分大小写。
| Link | URL | isActive |
|---|---|---|
<NavLink to="/SpOnGe-bOB" /> | /sponge-bob | true |
<NavLink to="/SpOnGe-bOB" caseSensitive /> | /sponge-bob | false |
aria-current
当 NavLink 处于活动状态时,它会自动将 <a aria-current="page"> 应用于底层锚标签。请参阅 MDN 上的 aria-current。
reloadDocument
reloadDocument 属性可用于跳过客户端路由,让浏览器正常处理转换(如同 <a href> )。
unstable_viewTransition
unstable_viewTransition 这个道具通过将最终状态更新封装在 document.startViewTransition() 中来启用该导航的视图转换。默认情况下,在过渡期间,一个 transitioning 类将被添加到 <a> 元素,你可以用它来定制视图过渡。
a.transitioning p {
view-transition-name: "image-title";
}
a.transitioning img {
view-transition-name: "image-expand";
}a.transitioning p {
view-transition-name: "image-title";
}
a.transitioning img {
view-transition-name: "image-expand";
}<NavLink to={to} unstable_viewTransition>
<p>Image Number {idx}</p>
<img src={src} alt={`Img ${idx}`} />
</NavLink><NavLink to={to} unstable_viewTransition>
<p>Image Number {idx}</p>
<img src={src} alt={`Img ${idx}`} />
</NavLink>您还可以使用 className / style 属性或传递给 children 的渲染属性,根据 isTransitioning 值进一步定制。
<NavLink to={to} unstable_viewTransition>
{({ isTransitioning }) => (
<>
<p
style={{
viewTransitionName: isTransitioning
? "image-title"
: "",
}}
>
Image Number {idx}
</p>
<img
src={src}
alt={`Img ${idx}`}
style={{
viewTransitionName: isTransitioning
? "image-expand"
: "",
}}
/>
</>
)}
</NavLink><NavLink to={to} unstable_viewTransition>
{({ isTransitioning }) => (
<>
<p
style={{
viewTransitionName: isTransitioning
? "image-title"
: "",
}}
>
Image Number {idx}
</p>
<img
src={src}
alt={`Img ${idx}`}
style={{
viewTransitionName: isTransitioning
? "image-expand"
: "",
}}
/>
</>
)}
</NavLink>IMPORTANT
请注意,此 API 已被标记为不稳定版,在未发布重大版本之前,可能会出现一些破坏性更新。