react路由01——react-routerV6 中路由传递参数的几种方式

本文详细介绍了ReactRouterV6中params、search和state三种参数传递方式,包括useParams、useMatch、useSearchParams和useLocation钩子的使用示例及其实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

1.1 关于react- router,上官网

1.2 react脚手架demo

2. 路由简单配置——无参数

  • 写法如下:
    在这里插入图片描述
  • 核心代码,如下:
     <Link to='/cats/info/'>
         {cat.catId}--{cat.catName}
     </Link>
    
     <Routes>
          <Route path='info' element={<CatInfo/>} />
     </Routes>
    
  • 效果
    在这里插入图片描述

3. 路由传参方式

3.1 params参数

3.1.1 params参数——useParams钩子

  • 要求:路由表配置的位置添加参数占位。
  • 实现方式如下:
    在这里插入图片描述
  • 核心代码如下:
    • cats.jsx,如下:
      import React from "react";
      import CatInfo from "./Info/CatInfo";
      import {Route,Routes,Link} from 'react-router-dom'
      
      class Cats extends React.Component{
          state = {
              cats:[
                  {catId:'A1001',catName:'点点'},
                  {catId:'A1002',catName:'阿苔'},
                  {catId:'A1003',catName:'花花'}
              ]
          };
          render(){
              const {cats} = this.state;
              return(
                  <div>
                      <h2>猫咪信息</h2>
                      <ul>
                          {
                              cats.map((cat)=>{
                                  return(
                                      <li key={cat.catId}>
                                          {/* 编写路由链接 */}
                                          <Link to={`/cats/info/${cat.catId}`}>
                                              {cat.catId}--{cat.catName}
                                          </Link>
                                      </li>
                                  )
                              })
                          }
                      </ul>
                      <br /><br />
                      <Routes>
                          {/* 注册路由 */}
                           <Route path='info/:catId' element={<CatInfo/>} />
                      </Routes>
                  </div>
              )
          }
      }
      export default Cats;
      
    • catInfo.jsx,如下:
      import React from "react";
      import { useParams } from "react-router-dom";
      import './catInfo.css'
      
      //数据备用   根据传来的catId 查找要展示的数据
      let catList = [
          {catId:'A1001',catName:'点点',catAge:5,catKind:'德文'},
          {catId:'A1002',catName:'阿苔',catAge:6,catKind:'德文'},
          {catId:'A1003',catName:'花花',catAge:2,catKind:'布偶'}
      ]
      
      export default function CatInfo(){
          const {catId} = useParams();//获取路由传递来的参数
          // 根据传递过来的catId 查找对应的数据
          const cat = catList.find((obj)=>{
              return obj.catId === catId;
          })
          return(
              <div>
                  <hr />
                  <table>
                      <caption>猫咪信息</caption>
                      <thead>
                          <tr>
                              <th>编号</th><th>姓名</th><th>年龄</th><th>品种</th>
                          </tr>
                      </thead>
                      <tbody >
                          <tr>
                              <td>{cat.catId}</td>
                              <td>{cat.catName}</td>
                              <td>{cat.catAge}</td>
                              <td>{cat.catKind}</td>
                          </tr>
                      </tbody>
                  </table>
              </div>
          )
      }
      
  • 效果如下:
    在这里插入图片描述

3.1.2 params参数——useMatch钩子

  • 传参数与上一致,如下:

    <li key={cat.catId}>
        {/* 编写路由链接 */}
        <Link to={`/cats/info/${cat.catId}/${cat.catName}`}>
                {cat.catId}--{cat.catName}
        </Link>
    </li>
    
    <Routes>
        {/* 注册路由 */}
        <Route path='info/:catId/:catName' element={<CatInfo/>} />
    </Routes>
    
  • 取参数如下:

    import { useMatch } from "react-router-dom";
    const data = useMatch('/cats/info/:catId/:catName');
    console.log(data);
    
    const {params} = useMatch('/cats/info/:catId/:catName');
    console.log(params.catName);
    
  • 效果如下:
    在这里插入图片描述

3.2 search参数

3.2.1 search参数——useSearchParams钩子

3.2.1.1 官方介绍
  • useSearchParams 钩子用于读取修改当前位置 URL 中的查询字符串。
  • 与 React 自己的 useState 钩子一样,useSearchParams 返回一个包含两个值的数组:当前位置的搜索参数和一个可用于更新参数的函数
  • 与 React 的 useState 钩子一样,setSearchParams 也支持功能更新。因此,您可以提供一个接收 searchParams 并返回更新版本的函数。
3.2.1.2 searchParams——读取
  • 说明:
    • search 传参的方式比较简单,参数的形式以 问号拼接 到地址后面。
    • 注册路由时不用占位。
  • 实现方式,如下:
    在这里插入图片描述
  • 核心代码,如下:
    • cats组件
      import React from "react";
      import CatInfo from "./Info/CatInfo";
      import {Route,Routes,Link} from 'react-router-dom'
      
      class Cats extends React.Component{
          state = {
              cats:[
                  {catId:'A1001',catName:'点点'},
                  {catId:'A1002',catName:'阿苔'},
                  {catId:'A1003',catName:'花花'}
              ]
          };
          render(){
              const {cats} = this.state;
              return(
              <div>
                  <h2>猫咪信息</h2>
                  <ul>
                      {
                          cats.map((cat)=>{
                              return(
                                  <li key={cat.catId}>
                                      {/* 编写路由链接 */}
                                      <Link to={`/cats/info?catId=${cat.catId}&catName=${cat.catName}`}>
                                          {cat.catId}--{cat.catName}
                                      </Link>
                                  </li>
                              )
                          })
                      }
                  </ul>
                  <br /><br />
                  <Routes>
                      {/* 注册路由 */}
                          <Route path='info/' element={<CatInfo/>} />
                  </Routes>
              </div>
              )
          }
      }
      export default Cats;
      
    • catInfo组件
      import React from "react";
      // import { useParams } from "react-router-dom";
      import { useSearchParams } from "react-router-dom";
      import './catInfo.css'
      
      //数据备用   根据传来的catId 查找要展示的数据
      let catList = [
          {catId:'A1001',catName:'点点',catAge:5,catKind:'德文'},
          {catId:'A1002',catName:'阿苔',catAge:6,catKind:'德文'},
          {catId:'A1003',catName:'花花',catAge:2,catKind:'布偶'}
      ]
      
      export default function CatInfo(){
          // const {catId} = useParams();//获取路由传递来的参数
          let [searchParams, setSearchParams] = useSearchParams();// 获取问号传递来的参数
          // console.log(searchParams);
          const catId = searchParams.get('catId'); //取参数通过 searchParams.get('key')
          const catName = searchParams.get('catName');
          console.log(catId,'---->',catName);
      
          // 根据传递过来的catId 查找对应的数据
          const cat = catList.find((obj)=>{
              return obj.catId === catId;
          })
          return(
              <div>
                  <hr />
                  <table>
                      <caption>猫咪信息</caption>
                      <thead>
                          <tr>
                              <th>编号</th><th>姓名</th><th>年龄</th><th>品种</th>
                          </tr>
                      </thead>
                      <tbody >
                          <tr>
                              <td>{cat.catId}</td>
                              <td>{cat.catName}</td>
                              <td>{cat.catAge}</td>
                              <td>{cat.catKind}</td>
                          </tr>
                      </tbody>
                  </table>
              </div>
          )
      }
      
  • 效果如下:
    在这里插入图片描述
3.2.1.3 setSearchParams——修改
  • 看官网例子
    在这里插入图片描述
  • 举个小例子,如下:
    在这里插入图片描述

3.2.2 search参数——useLocation钩子

3.2.2.1 获取参数
  • 代码如下:

    import { useLocation } from "react-router-dom";
    
    
    console.log("======使用useLocation======");
    const data = useLocation();
    console.log(data);
    
  • 效果如下:
    在这里插入图片描述

3.2.2.1 将获取的Location参数转对象——query-string
  • 首先安装
    npm i query-string
    
  • 引入 query-string 库
    import queryString from "query-string"
    
  • 转换成对象
    const data = useLocation();
    console.log(data);
    
    const dataObj =  queryString.parse(data.search); //转对象
    console.log(dataObj);
    
    在这里插入图片描述
  • 效果如下:
    在这里插入图片描述
  • 补充——将对象转换成location参数形式:
    • 代码如下:
      console.log("======obj转location======");
      const locationStr = queryString.stringify(dataObj);
      console.log(locationStr);
      
    • 效果如下:
      在这里插入图片描述

3.3 state参数

3.3.1 传参方式

  • 如下:
    在这里插入图片描述
     <li key={cat.catId}>
         {/* 编写路由链接 */}
         {/* 传递state参数 */}
         <Link to="/cats/info" state={{catId:cat.catId,catName:cat.catName}}>
             {cat.catId}--{cat.catName}
         </Link>
     </li>
    
    <Routes>
        {/* 注册路由 */}
        <Route path='info/' element={<CatInfo/>} />
    </Routes>
    

3.3.2 接受参数方式——useLocation钩子

  • 如下:

    import { useLocation } from "react-router-dom";
    
    const data = useLocation();
    let catId = data.state.catId;
    

    在这里插入图片描述

3.3.3 效果

  • 如下:
    在这里插入图片描述

4. 总结

4.1 params参数

取参方式,如下

  • useParams钩子

    • 路由链接 代码
      <Link to={`/cats/info/${cat.catId}`}>
      	 {cat.catId}--{cat.catName}
      </Link>
      
    • 注册路由 代码
      <Routes>
      	{/* 注册路由 */}
      	<Route path='info/:catId' element={<CatInfo/>} />
      </Routes>
      
    • 取参 代码
      import { useParams } from "react-router-dom";
      
      const {catId} = useParams();//获取路由传递来的参数
      
  • useMatch钩子

    • 路由链接 代码
      <Link to={`/cats/info/${cat.catId}/${cat.catName}`}>
              {cat.catId}--{cat.catName}
      </Link>
      
    • 注册路由 代码
      <Routes>
          {/* 注册路由 */}
          <Route path='info/:catId/:catName' element={<CatInfo/>} />
      </Routes>
      
    • 取参 代码
      import { useMatch } from "react-router-dom";
      
      const {params} = useMatch('/cats/info/:catId/:catName');
      console.log(params.catName);
      

4.2 search参数

取参方式,如下

  • useSearchParams钩子
    • 路由链接 代码
      <Link to={`/cats/info?catId=${cat.catId}&catName=${cat.catName}`}>
          {cat.catId}--{cat.catName}
      </Link>
      
    • 注册路由 代码
      <Routes>
          {/* 注册路由 */}
          <Route path='info/' element={<CatInfo/>} />
      </Routes>
      
    • 取参 代码
      import { useSearchParams } from "react-router-dom";
      
      let [searchParams, setSearchParams] = useSearchParams();// 获取问号传递来的参数
      // console.log(searchParams);
      const catId = searchParams.get('catId'); //取参数通过 searchParams.get('key')
      const catName = searchParams.get('catName');
      
  • useLocation钩子
    • 路由链接 代码(同上useSearchParams)
    • 注册路由 代码(同上useSearchParams)
    • 取参 代码
      import { useLocation } from "react-router-dom";
      import queryString from "query-string"
      
      const data = useLocation();
      console.log(data);
      
      const dataObj =  queryString.parse(data.search); //转对象
      console.log(dataObj);
      

4.3 state参数

取参方式,如下

  • useLocation钩子
    • 路由链接 代码
      {/* 传递state参数 */}
      <Link to="/cats/info" state={{catId:cat.catId,catName:cat.catName}}>
          {cat.catId}--{cat.catName}
      </Link>
      
    • 注册路由 代码
      <Routes>
          {/* 注册路由 */}
          <Route path='info/' element={<CatInfo/>} />
      </Routes>
      
    • 取参 代码
      import { useLocation } from "react-router-dom";
      
      const data = useLocation();
      let catId = data.state.catId;
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@素素~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值