React 第四十五节 Router 中 useHref() Hook的使用详解及注意事项

news2025/5/23 17:58:15

前言

React Router 中的 useHref 是一个用于生成完整 URL 路径的钩子
它可以将相对路径解析为绝对路径,并确保在不同路由层级中正确工作。
它常用于自定义导航组件需要手动构建链接的场景。

一、useHref核心用途

解析相对路径:自动将相对路径(如 ../settings)转换为基于当前路由的绝对路径。
生成完整 URL:适用于需要直接操作 href 的场景(如 <a> 标签或重定向)。
支持动态路由参数:正确处理包含参数的路由路径(如 /users/:id)。

二、useHref 基本用法

2.1、 基本示例:生成绝对路径

import { useHref } from "react-router-dom";

function CustomLink({ to, children }) {
  const href = useHref(to);
  return <a href={href}>{children}</a>;
}

// 使用示例
<CustomLink to="/about">关于我们</CustomLink>

2.2、参数说明

useHref 接收一个参数:
参数to:可以是字符串或对象(包含 pathname、search、hash 等属性)

说明:
字符串时:如"/users",表示直接路径
对象时:如:{ pathname: “…/settings”, search: “?page=1” },可以带查询参数的路径

三、useHref完整代码案例

场景:在嵌套路由中生成正确链接

// 路由配置
const router = createBrowserRouter([
  {
    path: "/dashboard",
    element: <Dashboard />,
    children: [
      {
        path: "profile",
        element: <Profile />,
      },
      {
        path: "settings",
        element: <Settings />,
      }
    ]
  }
]);

// Dashboard 组件(父路由)
function Dashboard() {
  return (
    <div>
      <h1>控制面板</h1>
      <nav>
        <CustomLink to="profile">个人资料</CustomLink> {/* 生成 /dashboard/profile */}
        <CustomLink to="../settings">设置</CustomLink> {/* 生成 /dashboard/settings */}
      </nav>
      <Outlet />
    </div>
  );
}

// 自定义链接组件
function CustomLink({ to, children }) {
  const href = useHref(to);
  return (
    <a 
      href={href}
      style={{ color: 'blue', textDecoration: 'underline' }}
    >
      {children}
    </a>
  );
}

四、useHref 高级用法

4.1、生成带查询参数的 URL

function ShareButton() {
  const href = useHref({
    pathname: "/share",
    search: "?utm_source=widget",
    hash: "#social"
  });

  return (
    <a href={href} target="_blank">
      分享到社交媒体
    </a>
  );
}
// 生成:/share?utm_source=widget#social

4.2、 useHref 处理动态路由参数

// 路由配置
{
  path: "/products/:id",
  element: <ProductDetail />
}

// 组件内使用
function ProductCard({ id }) {
  const href = useHref(`/products/${id}`);
  return (
    <a href={href}>
      查看商品详情
    </a>
  );
}

五、useHref 与直接字符串拼接的对比

useHref:可以自动处理相对路径和嵌套路由,但是需要引入 React Router
手动拼接字符串:不需要引入额外依赖,但是容易出错(特别是多层嵌套路由时)

六、 useHref 注意事项

6.1、必须在路由上下文中使用

组件需要包裹在 <Router> 组件内(如 <BrowserRouter>

6.2、不会触发路由导航

生成的链接需要用户点击或自行处理导航逻辑

6.3、参数类型安全

TypeScript 用户应使用 To 类型定义参数:

import type { To } from "react-router-dom";

function CustomLink({ to }: { to: To }) {
  const href = useHref(to);
  // ...
}

七、useHref 与 <Link> 的使用及应用场景区别

useHref:需要用户点击原生链接,才可以进行导航,使用于 传统<a>标签的场景中;
<Link>:多用于内部路由跳转(无刷新),适用于 SPA 内部导航 场景中

八、useHref 应用场景

8.1、邮件模板中的链接生成

function EmailTemplate() {
  const resetPasswordHref = useHref("/reset-password");
  return (
    <div>
      <p>请点击链接重置密码:</p>
      <a href={resetPasswordHref}>{resetPasswordHref}</a>
    </div>
  );
}

8.2、SEO 优化静态页面

function Sitemap() {
  const pages = ['/', '/about', '/contact'];
  return (
    <ul>
      {pages.map(path => (
        <li key={path}>
          <a href={useHref(path)}>{path}</a>
        </li>
      ))}
    </ul>
  );
}

我们使用 useHref可以安全地生成符合当前路由结构的 URL,避免手动拼接路径导致的错误。
它是构建灵活导航系统的关键工具,特别适用于需要与传统 HTML 特性深度集成的场景。

个人见解,如有错误,欢迎批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?

在 JavaScript 中&#xff0c;var { ipcRenderer } require(‘electron’); 这行代码的含义是&#xff1a; 1. require(‘electron’) 这是 Node.js 的模块引入语法&#xff0c;用于加载 Electron 的核心模块。electron 是 Electron 框架的主模块&#xff0c;提供了构建桌面…

计算机底层的多级缓存以及缓存带来的数据覆盖问题

没有多级缓存的情况 有多级缓存的情况 缓存带来的操作覆盖问题 锁总线带来的消耗太大了。

SpringBoot-1-入门概念介绍和第一个Spring Boot项目

文章目录 1 开发JAVA EE应用1.1 EJB1.2 Spring框架1.2.1 IoC(Inversion of Control)控制反转1.2.2 DI(Dependency Injection)依赖注入1.2.3 AOP面向切面编程1.3 Spring Boot1.4 Spring Cloud框架1.5 开发工具2 创建Spring Boot项目2.1 在线项目生成向导2.2 使用IDEA导入项目2.3…

基于FPGA的电子万年历系统开发,包含各模块testbench

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于FPGA的电子万年历系统开发,包含各模块testbench。主要包含以下核心模块&#xff1a; 时钟控制模块&#xff1a;提供系统基准时钟和计时功能。 日历计算模块&#xff1a…

MySQL 可观测性最佳实践

MySQL 简介 MySQL 是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高性能、可靠性和易用性而闻名&#xff0c;适用于各种规模的应用&#xff0c;从小型网站到大型企业级系统。 监控 MySQL 指标是维护数据库健康、优化性能和确保数据…

01-jenkins学习之旅-window-下载-安装-安装后设置向导

1 jenkins简介 百度百科介绍&#xff1a;Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 [1] Jenkins官网地址 翻译&…

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷

近日&#xff0c;苏州自动驾驶巴士线路——阳澄数谷示范线正式上线&#xff0c;即日起向全民免费开放试乘体验&#xff01; 在苏州工业园区地铁3号线倪浜•阳澄数谷站外&#xff0c;一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是&#xff0c;小巴造型奇…

每日Prompt:像素风格插画

提示词 像素风格插画&#xff0c;日式漫画脸&#xff0c;画面主体为一位站在路边的男孩&#xff0c;人物穿着黑色冲锋衣&#xff0c;手里拿着手机&#xff0c;男孩靠坐在机车旁边&#xff0c;脚边依偎着一只带着小摩托车头盔的小小猫&#xff0c;背景是雨中&#xff0c;身旁停…

Windows逆向工程提升之二进制分析工具:HEX查看与对比技术

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 十六进制查看工具 应用于逆向工程的知识点 ​编辑 二进制对比工具 应用于逆向工程的知识点 十六进制查看工具 十六进制查看器是逆向工程的基础工具&#xff0c;它可以以十六进制格式…

2024游戏安全白皮书:对抗激烈!PC游戏外挂功能数增长超149%,超85%移动外挂为定制挂(附获取方式)

2024 年&#xff0c;中国游戏市场实际销售收入达 3257.83 亿元&#xff0c;同比增长 7.53%&#xff1b;用户规模 6.74 亿人&#xff0c;同比增长 0.94%&#xff0c;再创新高。这份庞大的数据背后&#xff0c;更是对安全防线实力的严峻拷问。 在广东省游戏产业协会的指导下&…

12kV 环保气体绝缘交流金属封闭开关设备现场交流耐压试验规范

范围 本文件规定了12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验的被试设备及试验接线、试验条件、试验步骤、试验判据及异常处理方法。 本文件适用于12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验&#xff0c;其他气体绝缘交流金属封闭开关设备可参照执行。…

位图算法——判断唯一字符

这道题有多种解法&#xff0c;可以创建hash数组建立映射关系判断&#xff0c;但不用新的数据结构会加分&#xff0c;因此我们有“加分”办法——用位图。 我们可以创建一个整型变量&#xff08;32位&#xff09;而一共才26个字母&#xff0c;所以我们只要用到0-25位即可&#…

【UE5】环形菜单教程

效果 步骤 1. 下载图片资源&#xff1a;百度网盘 请输入提取码 提取码:fjjx 2. 将图片资源导入工程&#xff0c;如下 3. 新建3个控件蓝图&#xff0c;这里分别命名为“WBP_CircularMenu”、“WBP_Highlight”、“WBP_Icon” 4. 打开“WBP_Icon”&#xff0c;设置“所需” 添加…

Athena 执行引擎:在线服务计算的效率王者

引言 在在线服务领域&#xff0c;计算任务呈现出独特的特性&#xff1a;一方面&#xff0c;数据量通常不会过于庞大&#xff0c;因为在线服务对耗时和响应速度有着严苛要求&#xff1b;另一方面&#xff0c;计算任务具有可控性&#xff0c;其大多并非由用户实时输入动态生成&a…

飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】

书借上回&#xff0c;自从我反复重装paddle之后&#xff0c;我发现了&#xff0c;只要pip list中有库&#xff0c;但是代码报错&#xff0c;那就是飞桨没把代码更新完全&#xff0c;只能自己去改源代码 我又遇到报错了&#xff1a; 根据报错信息&#xff0c;找到ParallelEnv报…

微信小程序之Promise-Promise初始用

我们来尝试使用Promise。 1、需求&#xff0c;做个抽奖的按钮&#xff0c; 抽奖规则&#xff1a; 30%的几率中奖&#xff0c;中奖会提示恭喜恭喜&#xff0c;奖品为10万 RMB 劳斯莱斯优惠券&#xff0c;没中奖会提示再接再厉。 2、先搭界面&#xff1a; <view class&qu…

准备好,开始构建:由 Elasticsearch 向量数据库驱动的 Red Hat OpenShift AI 应用程序

作者&#xff1a;来自 Elastic Tom Potoma Elasticsearch 向量数据库现在被 “基于 LLM 和 RAG 的 AI 生成” 验证模式支持。本文将指导你如何开始使用。 Elasticsearch 已原生集成业内领先的生成式 AI 工具和服务提供商。欢迎观看我们的网络研讨会&#xff0c;了解如何突破 RA…

RNN神经网络

RNN神经网络 1-核心知识 1-解释RNN神经网络2-RNN和传统的神经网络有什么区别&#xff1f;3-RNN和LSTM有什么区别&#xff1f;4-transformer的归一化有哪几种实现方式 2-知识问答 1-解释RNN神经网络 Why&#xff1a;与我何干&#xff1f; 在我们的生活中&#xff0c;很多事情…

Linux | 开机自启动设置多场景实现

注&#xff1a;本文为“Llinux 设置开机自启”相关文章合辑。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 Linux 设置开机自启动的三种方法 幽夜卡尔 2022-10-22 一、在 /etc/rc.local 文件中添加自启动命令 编辑文件&#xff1a;执行以下命令&a…

杨校老师竞赛课之青科赛GOC3-4年级组模拟题

1.山峰&#xff08;程序填空&#xff09;程序填空题 题目描述 编程画出山峰。 要求&#xff1a;两个正三角形&#xff0c;三角形边长分别是200、100&#xff0c;山峰的颜色为8号色。 int main() {// 绘制等边三角形&#xff08;边长100&#xff09;&#xff1a;右转30度调整…