• React Router


    目录

    一、介绍

    1、作用

    2、安装

    二、使用

    1、导入

    2、定义路由

    2.1、HashRouter

    2.2、Route

    2.3、Switch

    3、重定向

    4、嵌套路由

    5、路由传参

    5.1、使用params参数

    5.2、使用search参数

    5.3、使用state参数

    6、声明式路由导航和编程式路由导航

    6.1、声明式路由导航

    6.2、编程式路由导航

    7、withRouter

    7.1、作用

    7.2、使用方法


    一、介绍

    1、作用

    路由是根据不同的URL地址展示不同的页面或者内容

    2、安装

    npm install react-router-dom@5

    二、使用

    1、导入

    1. //引入
    2. import   {HashRouterRoute, Switchfrom  'react-router-dom'

    2、定义路由

    建议:将路由单独封装在一个js文件中

    注意:一级路由与多级路由

    1. render(){
    2.      return  (
    3.        <div>
    4.           <HashRouter>
    5.              <Switch>
    6. <Route path="/about" component={About} />
    7. <Route path="/home" component={Home} />
    8. <Redirect to='/about' />
    9. Switch>
    10.           HashRouter>
    11.        div>
    12.      )
    13. }

    2.1、HashRouter

    作用:包裹整个应用,一个React应用只使用一次

    HashRouter与BrowserRouter的比较:

    模式URL表现形式刷新后对路由state参数的影响
    HashRouterlocalhost:3000/#刷新后会导致路由state参数的丢失

    BrowserRouter

    localhost:3000/没有任何影响,state保存在history对象中

    2.2、Route

    作用:用于定义路由路径和渲染组件的对应关系

    2.3、Switch

    使用Switch包裹Route来实现单一匹配,即匹配到一个路径之后,就会停止向下匹配,若不使用Switch包裹,则继续向下匹配

    3、重定向

    3.1、作用

    如果我们不想让用户访问某个路由或者该路由不在我们书写的路由中,我们可以让组件跳转到我们指定的路由

     <Redirect  to='/home/hot' />

    4、嵌套路由

    1. //父组件
    2. <HashRouter>
    3. <div>
    4. <NavLink to="/about">组件AboutNavLink> <span>span>
    5. <NavLink to="/home">组件HomeNavLink>
    6. <Switch>
    7. <Route path="/about" component={About} />
    8. <Route path="/home" component={Home} />
    9. <Redirect to='/about' />
    10. Switch>
    11. div>
    12. HashRouter>
    13. //子组件
    14. <div>
    15. <h3>Home内容h3>
    16. <NavLink to='/home/hot'>二级hotNavLink> <span>span>
    17. <NavLink to='/home/message'>二级messageNavLink>
    18. <div>
    19. <Switch>
    20. <Route path='/home/hot' component={Hot} />
    21. <Route path='/home/message' component={Message} />
    22. <Redirect to='/home/hot' />
    23. Switch>
    24. div>
    25. div>

    5、路由传参

    5.1、使用params参数

    1、传递params参数:展示
    2、声明接收params参数:
    3、接收params参数:const   {id, title} = props.match.params

    1. const index = () => {
    2. const arr = [
    3. {id:'001',title:'one'},
    4. {id:'002',title:'two'},
    5. {id:'003',title:'three'},
    6. ]
    7. return (
    8. <div>
    9. <ul>
    10. {
    11. arr.map((msg) => (
    12. <li key={msg.id}>
    13. {/* 向路由组件传递params参数 */}
    14. <Link to={`/home/message/detail/${msg.id}/${msg.title}`}>{msg.title}Link>
    15. li>
    16. ))
    17. }
    18. ul>
    19. <hr />
    20. {/* 声明接收params参数 */}
    21. <Route path='/home/message/detail/:id/:title' component={Detail} />
    22. div>
    23. )
    24. }
    25. const index = (props) => {
    26. const data = [
    27. {id:'001',text:'第一名'},
    28. {id:'002',text:'第二名'},
    29. {id:'003',text:'第三名'},
    30. ]
    31. //接收params参数
    32. const {id, title} = props.match.params
    33. const SearchResult = data.find((dataobj) => {
    34. return dataobj.id === id;
    35. })
    36. return (
    37. <div>
    38. <ul>
    39. <li>id:{id}li>
    40. <li>title:{title}li>
    41. <li>nm:{SearchResult.text}li>
    42. ul>
    43. div>
    44. )
    45. }

    5.2、使用search参数

    1、传递参数:展示

    2、不用声明接收:

    3、接收search参数:接收到的数据为字符串形式,需要转换成对象

    1. const index = () => {
    2. const arr = [
    3. {id:'001',title:'one'},
    4. {id:'002',title:'two'},
    5. {id:'003',title:'three'},
    6. ]
    7. return (
    8. <div>
    9. <ul>
    10. {
    11. arr.map((msg) => (
    12. <li key={msg.id}>
    13. {/* 向路由组件传递search参数 */}
    14. <Link to={`/home/message/detail/?id=${msg.id}&title=${msg.title}`}> {msg.title}Link>
    15. li>
    16. ))
    17. }
    18. ul>
    19. <hr />
    20. <Route path='/home/message/detail' component={Detail} />
    21. div>
    22. )
    23. }
    24. const index = (props) => {
    25. const detaildata = [
    26. {id:'001',text:'第一名'},
    27. {id:'002',text:'第二名'},
    28. {id:'003',text:'第三名'},
    29. ]
    30. //接收search参数
    31. const {search} = props.location
    32. const querystring = require('querystringify')
    33. const obj = querystring.parse(search.slice(1))
    34. const {id, title} = obj
    35. const SearchResult = detaildata.find((dataobj) => {
    36. return dataobj.id === id;
    37. })
    38. return (
    39. <div>
    40. <ul>
    41. <li>id:{id}li>
    42. <li>title:{title}li>
    43. <li>nm:{SearchResult.text}li>
    44. ul>
    45. div>
    46. )
    47. }

    5.3、使用state参数

    1、传递state参数:展示
    2、不用声明接收:
    3、接收state参数:const  {id, title} = props.location.state

    注意:刷新后对路由state参数的影响

                 (1)、BrowserRouter没有任何影响,因为state保存在history对象中。

                 (2)、HashRouter刷新后会导致路由state参数的丢失

    1. const index = () => {
    2. const arr = [
    3. {id:'001',title:'one'},
    4. {id:'002',title:'two'},
    5. {id:'003',title:'three'},
    6. ]
    7. return (
    8. <div>
    9. <ul>
    10. {
    11. arr.map((msg) => (
    12. <li key={msg.id}>
    13. {/* 向路由组件传递state参数 */}
    14. <Link to={{pathname:'/home/message/detail',state:{id:msg.id,title:msg.title}}}>{msg.title}Link>
    15. li>
    16. ))
    17. }
    18. ul>
    19. <hr />
    20. <Route path='/home/message/detail' component={Detail} />
    21. div>
    22. )
    23. }
    24. const index = (props) => {
    25. const detaildata = [
    26. {id:'001',text:'第一名'},
    27. {id:'002',text:'第二名'},
    28. {id:'003',text:'第三名'},
    29. ]
    30. //接收state参数
    31. const {id, title} = props.location.state || {}
    32. const SearchResult = detaildata.find((dataobj) => {
    33. return dataobj.id === id;
    34. }) || {}
    35. return (
    36. <div>
    37. <ul>
    38. <li>id:{id}li>
    39. <li>title:{title}li>
    40. <li>nm:{SearchResult.text}li>
    41. ul>
    42. div>
    43. )
    44. }

    6、声明式路由导航和编程式路由导航

    6.1、声明式路由导航

    1. <NavLink  to="/home">homeNavLink>
    2. <NavLink  to="/second">secondNavLink>
    3. <NavLink  to="/mine">mineNavLink>

    6.2、编程式路由导航

    利用props.history对象下的push和replace进行跳转

    1、push(跳转会形成history,可返回到上一层)

    props.history.push('/home/message/detail/${id}/${title}')

    2、replace(replace跳转不会形成history,不可以返回到上一层, 适用于登录后,不需要重新回到登录页面)

    props.history.replace('/home/message/detail/${id}/${title}')

    7、withRouter

    7.1、作用

    可以让一般组件(没有通过component渲染的组件)获取到history属性

    7.2、使用方法

    1、在需要使用history属性的组件中引入withRouter

    import {withRouter} from 'react-router-dom'

    2、默认导出

    export default withRouter(组件名称)
  • 相关阅读:
    零基础入门JavaWeb——HTML相关知识
    嵌入式技术学习——c51——串口
    CSS3选择器详解 前端开发入门笔记(六)
    HarmonyOS开发环境搭建
    【LeetCode-235】二叉搜索树的最近公共祖先
    二叉树的重要概念
    互联网上做副业,要如何开启第一步?
    JWT(令牌)
    VGG16网络结构学习笔记
    Ubuntu系统配置DDNS-GO【笔记】
  • 原文地址:https://blog.csdn.net/weixin_43765641/article/details/127577231