React router-v6 路由详解

在 React Router v6 中,路由传参主要有三种方式:params 参数search 参数state 参数。以下是详细用法及场景说明,结合多个来源的实践案例整理:

一、Params 参数(动态路由参数)

适用场景:传递必选参数(如用户 ID、商品 ID)。
实现步骤

  1. 定义路由占位符
    在路由配置中使用 :paramName 格式声明参数占位符:

    <Route path="/user/:id" element={<UserDetail />} />
  2. 传参
    通过 navigate<Link> 传递参数:

    // 编程式导航(函数组件)
    import { useNavigate } from 'react-router-dom';
    const navigate = useNavigate();
    navigate('/user/123');  // 直接拼接参数值
    
    // 声明式导航(JSX)
    <Link to="/user/123">用户详情</Link>
  3. 取参
    在目标组件中使用 useParams 获取参数:

    import { useParams } from 'react-router-dom';
    const { id } = useParams();  // { id: '123' }

    注意:参数默认是字符串类型,需手动转换数值类型(如 parseInt(id)

二、Search 参数(URL 查询参数)

适用场景:传递可选参数(如筛选条件、排序规则)。
实现步骤

  1. 传参
    在 URL 中拼接 ?key=value 格式的查询字符串:

    // 编程式导航
    navigate('/search?keyword=react&page=1');
    
    // 声明式导航
    <Link to="/search?keyword=react&page=1">搜索</Link>
  2. 取参
    使用 useSearchParams 钩子解析查询参数:

    import { useSearchParams } from 'react-router-dom';
    const [searchParams, setSearchParams] = useSearchParams();
    const keyword = searchParams.get('keyword');  // 'react'
    const page = searchParams.get('page');         // '1'

    特性:支持动态修改参数(setSearchParams({ page: 2 })

三、State 参数(隐式参数)

适用场景:传递敏感或临时数据(如表单状态),不暴露在 URL 中。
实现步骤

  1. 传参
    通过 state 对象传递参数:

    // 编程式导航
    navigate('/checkout', { 
      state: { productId: '456', quantity: 2 }
    });
    
    // 声明式导航
    <Link to="/checkout" state={{ productId: '456', quantity: 2 }}>结算</Link>
  2. 取参
    使用 useLocation 获取 state

    import { useLocation } from 'react-router-dom';
    const { state } = useLocation();
    const { productId, quantity } = state;  // { productId: '456', quantity: 2 }

    注意:刷新页面时 state 参数会丢失,需通过本地存储或重新加载数据恢复

四、参数传递对比与选择

方式特点适用场景

Params

URL 显式,需路由占位符必选参数(如资源 ID)

Search

URL 显式,无需修改路由可选参数(如筛选条件)

State

URL 不显式,临时或敏感数据表单状态、临时跳转

五、常见问题与解决方案

  1. 参数类型错误

    • 问题:Params 和 Search 参数默认是字符串类型。
    • 解决:手动转换类型(如 Number(id)) 
  2. 类组件传参

    • 问题:v6 移除了 withRouter,类组件无法直接使用钩子。
    • 解决:改用函数组件,或通过高阶组件封装 useParams 
  3. 路由刷新参数丢失

    • 问题:State 参数在刷新后丢失。
    • 解决:将关键数据存入 localStorage 或通过接口重新加载 

通过灵活组合这三种传参方式,可以满足 React Router v6 中不同场景的需求。实际开发中建议优先使用 ParamsSearch 参数,仅在需要隐私保护时使用 State 参数。

React v6中的路由使用react-router-dom库进行管理。通过使用以下命令安装该库:`yarn add react-router-dom@6`。 相较于之前的版本,V6版本的react-router-dom进行了一些改进。嵌套路由的写法有所改变,并且引入了新的钩子函数useNavigate来替代useHistory,使整体更易于理解。 React中有三种常用的路由方式:react-router-dom适用于浏览器的路由,BrowerRouter基于浏览器的history,HashRouter基于地址部分的hash值(路由带“#”)。而react-router-native适用于原生app的路由react-router是原生与浏览器通用的部分。 在React v6中,你可以使用`yarn add react-router-dom@6`来安装React Router。安装后,你可以使用`BrowserRouter`组件来创建基于浏览器的路由,或者使用`HashRouter`组件来创建基于地址栏hash值的路由。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [React-Router V6 使用详解](https://blog.csdn.net/zjjcchina/article/details/121921585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【React学习】React路由 v6](https://blog.csdn.net/zx1041561837/article/details/125970331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值