面试题:React Router 中的 Link 标签和 HTML 的 a 标签有什么区别?

在 React 应用中,<Link> 标签(来自 React Router)和原生的 HTML <a> 标签虽然都用于导航,但它们在工作原理、用户体验和性能上有本质区别。


核心区别总结

特性<Link> (React Router)<a> (HTML 原生)
页面跳转方式客户端路由(不刷新页面)服务端路由(刷新页面)
用户体验流畅、快速(SPA 体验)卡顿、有白屏(传统网页体验)
网络请求只请求必要的数据/代码重新请求整个 HTML、CSS、JS
适用场景SPA 内部路由跳转跳转到外部网站或非 SPA 页面

1. 工作原理详解

<a> 标签:传统页面跳转

  • 行为:当你点击 <a href="/about"> 时,浏览器会向服务器发起一个全新的 HTTP 请求,获取 /about 路径对应的完整 HTML 页面。
  • 结果整个页面重新加载,包括 HTML、CSS、JavaScript 等所有资源。
  • 问题:在单页应用(SPA)中,这会破坏“单页”的体验,导致白屏、卡顿,丢失当前页面的状态。
<!-- 点击后会刷新整个页面 -->
<a href="/about">关于我们</a>

<Link> 标签:客户端路由跳转

  • 行为<Link> 本质上是一个被 React Router 增强的 <a> 标签。它通过 history.pushState() API(或 history.replaceState())来修改浏览器的 URL,但阻止了默认的页面跳转行为
  • 结果不刷新页面。React Router 监听 URL 变化,然后根据路由配置,只渲染对应的新组件,实现“无缝”切换。
  • 优势:保持了 SPA 的流畅体验,性能更好。
import { Link } from 'react-router-dom';

// 点击后只更新 URL 和 React 组件,不刷新页面
<Link to="/about">关于我们</Link>

2. 实际效果对比

假设你的应用有两个页面:/home/about

  • 使用 <a>
    1. 用户在 /home 页面。
    2. 点击 <a href="/about">
    3. 浏览器向服务器请求 /about 的 HTML。
    4. 服务器返回新的 HTML,浏览器完全替换当前页面
    5. React 应用重新启动,所有状态丢失。
  • 使用 <Link>
    1. 用户在 /home 页面。
    2. 点击 <Link to="/about">
    3. React Router 拦截点击,调用 history.pushState('/about')
    4. 浏览器 URL 变为 /about,但页面不刷新
    5. React Router 检测到 URL 变化,渲染 About 组件。
    6. 用户看到新内容,体验流畅。

3. 其他重要区别

🔗 href vs to 属性

  • <a> 使用 href 属性。
  • <Link> 使用 to 属性(可以是字符串或对象)。
<Link to="/about">内部页面</Link>
<Link to={{ pathname: '/search', search: '?q=react' }}>搜索</Link>

🌐 外部链接

  • 对于外部网站,你仍然应该使用原生的 <a> 标签。
  • 使用 <Link> 跳转到外部链接是错误的,因为它会尝试在客户端路由中解析,导致 404。
<!-- ✅ 正确:外部链接用 <a> -->
<a href="https://google.com" target="_blank" rel="noopener noreferrer">
  跳转到 Google
</a>

<!-- ❌ 错误:不要用 Link 跳转外部网站 -->
<Link to="https://google.com">Google</Link>

⚙️ 高级功能

<Link> 提供了更多 React Router 特有的功能:

  • replace: 使用 history.replaceState() 替换当前历史记录,而不是添加新记录。<Link to="/login" replace>登录(替换历史)</Link>
  • state: 可以传递状态数据到目标页面。<Link to="/profile" state={{ from: 'home' }}>个人中心</Link>
  • 与路由状态集成:可以与 useLocation(), useNavigate() 等 Hook 无缝配合。

4. 何时使用哪个?

场景使用标签
跳转到应用内的其他路由<Link to="...">
跳转到外部网站<a href="https://...">
下载文件<a href="/file.pdf" download>
锚点跳转(同一页面内的 ID)<a href="#section1"><Link to="#section1">

总结

  • <Link> 是 React Router 为单页应用(SPA)内部导航设计的组件。它通过客户端路由实现无刷新跳转,提供流畅的用户体验。
  • <a> 是标准的 HTML 锚点标签,用于传统的页面跳转或外部链接,会导致整个页面重新加载。

简单记忆

在 React SPA 中,内部跳转用 <Link>,外部跳转用 <a>

THE END
喜欢就支持一下吧
点赞10 分享