- Objective:
- Breadcrumb:
# 概念阐释
## 语义
在React中,我们使用`Link`或`NavLink`替代HTML中的`<a>`标签,允许用户在**不触发完整页面重新加载**的情况下导航到不同的路由。而`NavLink`作为一种特殊的`Link`,带有默认的`a.active`属性,能够完成更细颗粒度的控制和反馈。例如:
- 突出显示当前的链接,加粗或背景颜色不同;
- 为屏幕阅读器等辅助技术提供有用的上下文;
- 提供了一个“转换”值,可以更细颗粒度地控制试图转换;
## 语法
```js
// Link
<Link to={}>...</Link>
// NavLink
<NavLink
to="/messages"
className={({ isActive, isPending }) =>
isPending ? "pending" : isActive ? "active" : ""
}
>
Messages
</NavLink>;
```
# 实例
### `<Link>`
```js
import * as React from "react";
import { Link } from "react-router-dom";
function UsersIndexPage({ users }) {
return (
<div>
<h1>Users</h1>
<ul>
{users.map((user) => (
<li key={user.id}>
<Link to={user.id}>{user.name}</Link>
</li>
))}
</ul>
</div>
);
}
```
### `NavLink`+样式改变
```js
...
import { NavLink } from "react-router-dom";
export default function Header () {
...
return (
<div className="header">
<NavLink to="/about">About</NavLink>
<NavLink to="/articles">Articles</NavLink>
<NavLink to="/categories">Categories</NavLink>
{
currentUser.username
? <>
<a href="/profile">Profile</a>
<button onClick={handleLogout} className="logout"> Log Out </button>
</>
: <NavLink to="/sign-up">Sign Up</NavLink>
}
</div>
)
}
```
```css
/* 当用户停留在导航栏所在页面时,导航栏的字体是加粗的 */
.header a.active {
font-weight: bold;
}
```
# 相关内容
之所以不在 React 中使用`a`标签是因为它会导致页面重新加载,而 NavLink 不会。React 是[[SPA]]。
# 参考资料
- [NavLink-React Router](https://reactrouter.com/en/main/components/nav-link)
- [Linking to Route - codecademy](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-react-router-60d12e07-e364-45e4-9102-8d919d464f5e/lessons/intermediate-react-router-v6/exercises/2022-audit-linking-to-routes)
- 本地文件夹:react_router_v6_lession_starting_code