React-Router useParams、useSearchParams用法(路由参数获取)

React-Router useParams、useSearchParams用法(路由参数获取)

1 路由参数和查询参数

路由参数(Route Parameters)和查询参数(Query Parameters)是在Web开发中用于传递数据和配置路由的常见概念。

路由参数(Route Parameters):

  • 路由参数是在URL路径中的一部分,用于标识和区分不同的资源或页面。
  • 路由参数通常用于表示具有唯一标识符的实体,如用户ID、产品ID等。
  • 路由参数使用冒号(:)来定义,并在URL中使用对应的值来替代。
  • 示例:/users/:id,其中:id是路由参数,可以匹配任何具体的用户ID值。

查询参数(Query Parameters):

  • 查询参数是URL中以问号(?)开始的键值对形式的参数。
  • 查询参数用于传递附加的数据、过滤条件或配置选项。
  • 查询参数可以包含多个键值对,每个键值对由等号(=)连接。
  • 多个查询参数之间使用和号(&)分隔。
  • 示例:/search?q=react&sort=asc,其中qsort是查询参数的键,reactasc是对应的值。

路由参数和查询参数在URL中扮演不同的角色:

  • 路由参数用于在URL中标识和定位特定的资源或页面。
  • 查询参数用于传递额外的数据或配置选项,可以用于过滤、排序、分页等操作。

2 useParams

useParams是React Router提供的一个钩子函数,用于获取当前路由参数的值。它常被用来访问和使用URL中的动态参数。

以下是useParams()的使用方法:

  1. 首先,确保你已经安装并引入了react-router-dom
  2. 在需要使用动态参数的组件中,使用useParams()钩子函数
  3. 调用useParams()它会返回一个对象,其中包含URL参数的键值对
  4. 使用解构语法从返回的对象中提取所需的参数值

举个例子,假设我们的路由定义如下:

<Route path="/profile/:username" component={UserProfile} />

当用户访问/profile/John时,react会渲染UserProfile组件。

import { useParams } from 'react-router-dom';

const UserProfile = () => {
  const params = useParams();   //params:{ username: 'John' }
  const { username } = params;  //username:'John'

  return (
    <div>
      <h2>User Profile</h2>
      <p>Username: {username}</p>
    </div>
  );
};

export default UserProfile;

UserProfile组件中,useParams()会返回一个包含{ username: 'John' }的对象,使用对象解构获取username,我们可以将username值显示在组件中。

3 useSearchParams

useSearchParams()也是React Router提供的一个钩子函数,用于获取当前URL查询参数的值。它常被用来访问和操作URL查询参数。

以下是useSearchParams()的使用方法:

  1. 首先,确保你已经安装并引入了react-router-dom
  2. 在需要访问查询参数的组件中,使用useSearchParams钩子函数
  3. 调用useSearchParams,它会返回一个数组,其中包含两个元素:URL查询参数对象、用于更新URL查询参数的函数
  4. 使用解构语法从返回的数组中提取所需查询参数

同样举个例子,假设我们的URL为/search?q=react,我们需要在组件中使用查询参数q的值,获取q值的代码如下:

import { useSearchParams } from 'react-router-dom';

const SearchResults = () => {
  const [searchParams] = useSearchParams();
  const query = searchParams.get('q');

  return (
    <div>
      <h2>Search Results</h2>
      <p>Query: {query}</p>
    </div>
  );
};

export default SearchResults;

useSearchParams()将返回一个数组,其中第一个元素是包含{ q: 'react' }的对象。然后,我们使用searchParams.get('q')来获取名为q的查询参数的值。

### React Router v6 中的路由跳转传参方法 在 React Router v6 中,可以通过多种方式实现在路由跳转时传递参数,并且可以在目标页面轻松获取这些参数。 #### 使用 `navigate` 函数进行路径匹配传参 当执行编程式的导航操作时,可以利用 `useNavigate` Hook 提供的 `navigate` 方法来构建带有动态部分的新 URL。例如: ```javascript import { useNavigate } from 'react-router-dom'; function MyComponent() { const navigate = useNavigate(); function handleClick() { // 动态设置路径中的参数值 navigate(`/systemSet/list/${someId}`); } return ( <button onClick={handleClick}>Go to List</button> ); } ``` 这种方式适用于简单的 ID 或名称等作为路径的一部分传递给下一个页面[^2]。 #### 查询字符串形式附加额外数据 对于更复杂的数据结构或者不想改变原有URL模式的情况下,则可以选择通过查询字符串的形式附带信息。这需要用到第三方库如 `qs` 来帮助序列化对象成查询串格式: ```javascript import qs from 'qs'; import { useNavigate } from 'react-router-dom'; function AnotherComponent() { const navigate = useNavigate(); function handleQuerySubmit(data) { let queryString = qs.stringify({ id: data.id, name: data.name }); navigate({ pathname: '/chargingStation/addCharginns', search: '?' + queryString }); } return /* ... */; } ``` 这样做的好处是在不影响整体 URL 设计的前提下增加了灵活性。 #### 利用状态(state)携带隐藏参数 如果希望某些敏感的信息不暴露于浏览器地址栏中,那么还可以考虑采用 `state` 属性来进行跨页间通信。此特性允许开发者向即将访问的目标位置发送任意 JavaScript 对象而不必担心其可见性问题: ```javascript // 发送端 navigate('/chargingStation/addCharginns', { replace: false, state: { id: 100, name: 'zhufeng' } }); // 接收端 (新页面加载完成后立即读取) import { useLocation } from 'react-router-dom'; function TargetPage() { const location = useLocation(); useEffect(() => { console.log(location.state); }, [location]); return /* ... */ ; } ``` 这种方法非常适合处理那些不需要长期保存但在短时间内需要共享的状态信息。 #### 获取并解析路径参数 为了能够接收到上述提到的各种类型的参数,在接收方组件内部应当相应地调用特定 Hooks 进行提取工作。比如要取得定义好的路径变量(`:id`),则需依赖 `useParams()`;而对于查询字符串而言则是依靠 `useSearchParams()` 实现自动解码功能[^3]: ```typescript jsx import { useParams, useSearchParams } from 'react-router-dom'; const MyDocument = () => { const params = useParams(); // 解析 :id 类型参数 const [searchParams] = useSearchParams(); // 处理 ?key=value 形式 return ( <> Document Id is: {params.id}<br/> Query Param Name: {searchParams.get('name')} </> ) }; ``` 综上所述,React Router v6 提供了丰富的 API 支持不同场景下的需求,无论是简单还是复杂的参数交换都能得到妥善解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值