react-router-dom之路由传参

17 篇文章 1 订阅
一:路由组件和普通组件的区别
  • 如果说组件是通过路由跳转过来的,我们可以直接获取到history,location,match对象
  • 如果说组件是一个普通的组件,那么是不可以直接获取到history,location,match对象的
可以看到我们不可以获取到history和location,match对象

在这里插入图片描述

接下来我们使用高阶组件 withRouter
import React, { Component } from 'react'

import { BrowserRouter as Router, Route, Link, Switch,useHistory,withRouter   } from 'react-router-dom'

function Teacher(props) {
  console.log("props-teacher",props);
  return (
    <div>
      <h1>老师</h1>
    </div>
  )
}
const WithRouterTeacher = withRouter(Teacher)
function MathTeacher(props) { // 编程式导航跳转
  console.log("props-mathTeacher",props);
  let history = useHistory();
  const jumpHandler = ()=>{
    history.push("/teacher")
  }
  return (
    <div>
      <h1>数学老师</h1>
      <button onClick={jumpHandler}>跳转</button>
      <WithRouterTeacher/>
      {/* <Teacher></Teacher> */}
    </div>
  )
}
function EnglishTeacher() {
  return (
    <div>
      <h1>英语老师</h1>
    </div>
  )
}


export default class index extends Component {
  render() {
    return (
      <div>
        <>
        <Router>
          <ul>
            <li><Link to="/teacher">老师</Link></li>
            <li><Link to="/teacher/math">数学老师</Link></li>
            <li><Link to="/teacher/english">英语老师</Link></li>
          </ul>
          <Switch>
            <Route path="/teacher" exact component={Teacher}></Route>
            <Route path="/teacher/math" component={MathTeacher}></Route>
            <Route path="/teacher/english" component={EnglishTeacher}></Route>
          </Switch>
        </Router>
        </>
      </div>
    )
  }
}

我们使用高阶组件withRouter,可以看到普通组件也获取了history,location,match对象了

在这里插入图片描述

二 路由传参
(1): react-router-dom@5版本
  1. params动态路由传参 /path/:params
    const age = 20;
   <li><Link  to={`/teacher/${age}`}>老师</Link></li>
    <Route path="/teacher/:age" exact component={Teacher}></Route>
   获取 this.props.match.params.age

   
  1. query传参
    history.push({pathname:'/teacher',query: { age: 20 }}) // 编程式导航
    获取:this.props.location.query?.age
         this.props.history.location.query?.age
    这种的缺点就是页面刷新参数会消失掉
  1. state传参(推荐使用)
      history.push({pathname:'/teacher',state: { age: 20 }}) // 编程式导航
     获取:this.props.location.state?.age
          this.props.history.location.state?.age
    

4:search结合query-string

  yarn add query-string
    history.push({pathname:'/teacher',search: "?age=20&name=lxs"}) // 编程式导航
     获取:this.props.location.state?.age
      let { age,name} = querystring.parse(props.location.search)
       let { age,name} = querystring.parse(props.history.location.search)
(1): react-router-dom@6版本(目前正在学习,稍后更新)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React Router v6中,路由传参可以通过以下几种方式实现: 1. 使用URL参数传递数据: 在路由路径中使用冒号(:)定义参数,然后在组件中通过`useParams`钩子函数获取参数的值。例如: ```jsx import { BrowserRouter as Router, Routes, Route, Link, useParams } from 'react-router-dom'; function User() { const { id } = useParams(); return <h2>User ID: {id}</h2>; } function App() { return ( <Router> <nav> <ul> <li> <Link to="/user/1">User 1</Link> </li> <li> <Link to="/user/2">User 2</Link> </li> </ul> </nav> <Routes> <Route path="/user/:id" element={<User />} /> </Routes> </Router> ); } export default App; ``` 当点击链接时,会根据参数的不同显示不同的用户ID。 2. 使用查询参数传递数据: 在URL中使用查询参数传递数据,可以通过`useLocation`钩子函数获取查询参数的值。例如: ```jsx import { BrowserRouter as Router, Routes, Route, Link, useLocation } from 'react-router-dom'; function User() { const location = useLocation(); const params = new URLSearchParams(location.search); const name = params.get('name'); return <h2>Hello, {name}</h2>; } function App() { return ( <Router> <nav> <ul> <li> <Link to="/user?name=John">User John</Link> </li> <li> <Link to="/user?name=Jane">User Jane</Link> </li> </ul> </nav> <Routes> <Route path="/user" element={<User />} /> </Routes> </Router> ); } export default App; ``` 当点击链接时,会根据查询参数的不同显示不同的用户名称。 3. 使用状态传递数据: 在React Router v6中,可以使用状态传递数据。通过使用`useNavigate`钩子函数获取导航函数,然后在组件中使用状态来传递数据。例如: ```jsx import { BrowserRouter as Router, Routes, Route, Link, useNavigate } from 'react-router-dom'; import { useState } from 'react'; function User() { const navigate = useNavigate(); const [name, setName] = useState(''); const handleSubmit = (e) => { e.preventDefault(); navigate(`/user/${name}`); }; return ( <div> <form onSubmit={handleSubmit}> <input type="text" value={name} onChange={(e) => setName(e.target.value)} /> <button type="submit">Go</button> </form> </div> ); } function UserDetails() { const { name } = useParams(); return <h2>Hello, {name}</h2>; } function App() { return ( <Router> <nav> <ul> <li> <Link to="/user">User</Link> </li> </ul> </nav> <Routes> <Route path="/user" element={<User />} /> <Route path="/user/:name" element={<UserDetails />} /> </Routes> </Router> ); } export default App; ``` 当在输入框中输入用户名并点击提交按钮时,会根据输入的用户名显示相应的用户详情。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lxslxskxs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值