• React 路由/5版本


    脚手架编译打包出来的是 SPA 单页面应用 所依赖的核心就是前端路由

    安装:指定5版本

    npm i react-router-dom@5  

    一、入口文件要包裹 HashRouter / BrowserRouter

    1. // 相当于 main.js
    2. import React from 'react';
    3. import ReactDOM from 'react-dom/client';
    4. import './index.css';
    5. import App from './App';
    6. import {HashRouter,BrowserRouter} from 'react-router-dom'
    7. import reportWebVitals from './reportWebVitals';
    8. const root = ReactDOM.createRoot(document.getElementById('root'));
    9. root.render(
    10. // React.StrictMode 标签 严格模式 检查
    11. <React.StrictMode>
    12. <HashRouter>
    13. <App />
    14. HashRouter>
    15. React.StrictMode>
    16. );
    17. // 页面性能分析 需要 web-vitals库的支持
    18. reportWebVitals();

    react-router-dom  一些内置组件使用的介绍:

    1. Link 路由跳转的按钮 to = '路径名'
    2. NavLink 带有高亮效果的 路由导航(添加 active类名)
    3. Route   path = 要匹配的路径  component = 对应展示的组件 exact属性 开启严格匹配
    4. Swicth  开启精准匹配 当匹配上一个路径时 显示对应组件 不再继续向下匹配
    5. Redirect  默认指向  没有匹配上时就对应这个
    1. //import axios from 'axios';
    2. import React, { Component } from 'react'
    3. import './App.css';
    4. import {NavLink,Route,Switch,Redirect} from 'react-router-dom'
    5. import Home from './component/Home'
    6. import About from './component/About'
    7. import Formerly from './component/Formerly'
    8. import Case from './page/Case'
    9. import MyNavLink from './component/MyNavLink'
    10. export default class App extends Component {
    11. render(){
    12. return (
    13. <div className="container">
    14. <div className="row">
    15. <div className="col-xs-offset-2 col-xs-8">
    16. <div className="page-header"><h2>React Router Demoh2>div>
    17. div>
    18. div>
    19. <Formerly a={8755}/>
    20. <div className="row">
    21. <div className="col-xs-2 col-xs-offset-2">
    22. <div className="list-group">
    23. <NavLink className='list-group-item' to='/about'>AboutNavLink>
    24. <NavLink className='list-group-item' to='/home'>HomeNavLink>
    25. <NavLink className='list-group-item' to='/case'>CaseNavLink>
    26. 自己封装:
    27. <MyNavLink to="about/b/c">关于MyNavLink>
    28. <MyNavLink to="home">首页MyNavLink>
    29. <MyNavLink to="case" children="案例">MyNavLink>
    30. 模糊匹配精准匹配
    31. div>
    32. div>
    33. <div className="col-xs-6">
    34. <div className="panel">
    35. <div className="panel-body">
    36. <Switch>
    37. <Route path='/about' exact component={About}>Route>
    38. <Route path='/home' component={Home}>Route>
    39. <Route path='/case' component={Case}>Route>
    40. <Route path='/about' component={Formerly}>Route>
    41. <Redirect to="/home"/>
    42. Switch>
    43. div>
    44. div>
    45. div>
    46. div>
    47. Redirect写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由 <br>br>
    48. 普通about 开启了严格匹配 Formerly没有开启 所以 about/b/c 关于 会导向 Formerly
    49. div>
    50. )
    51. }
    52. }

    封装MyNavLink

    相同的类名比较多时可以 自行封装一下  接收到的props 直接展开到 组件中

    传入 children  就是写入标签内的数据

    1. import React, { Component } from 'react'
    2. import { NavLink } from 'react-router-dom'
    3. export default class index extends Component {
    4. render() {
    5. return (
    6. <NavLink {...this.props} className="list-group-item">NavLink>
    7. )
    8. }
    9. }

    路由组件与一般组件

    1.写法不同 引用方式不同

                一般组件: 手动固定引入

                路由组件:  用到时再加载

    2.接收到的props不同: 

                一般组件:写组件标签时传递了什么,就能收到什么

                路由组件:接收到三个固定的属性 history location match

    嵌套路由:

    1.注册子路由时要写上父路由的path值

    2.路由的匹配是按照注册路由的顺序进行的

    这里以 Case组件为例

    1. import React, { Component } from 'react'
    2. import New from './New'
    3. import Message from './Message'
    4. import { Link,Route } from 'react-router-dom'
    5. export default class Case extends Component {
    6. render() {
    7. //console.log('路由组件会有默认props',this.props,'这里也执行了两次?')
    8. return (
    9. <div>
    10. <h3>
    11. Case组件是保存在 page里的路由组件
    12. <br />
    13. 这里显示的是嵌套路由
    14. h3>
    15. <Link to='/case/new'>新闻Link>
    16. <Link to='/case/message'>消息Link>
    17. <Route path="/case/new" component={New}>Route>
    18. <Route path="/case/message" component={Message}>Route>
    19. div>
    20. )
    21. }
    22. }

    路由传递参数

    1.params 传参 

    路径跳转时直接写上 数据 / 分割 

    美食

    匹配展示时 要接上占位符 :标识

    在跳转的组件内部  this.props.match.params 解构出来 使用

    const {id,title} = this.props.match.params

    2.search 传参

    相当于url中的query字符串 ?开始 &分隔

    汽车 

    匹配展示时不用添加参数

     

    接收 search 参数 在 this.props.location 里 但它是查询字符转  想用要转化成对象

    const {search} = this.props.location

    3.state传参

    单独写对象 pathname 路径名  state传递的参数分开

    娱乐 

    匹配展示时不用添加参数

     

    接收 state 参数 在 this.props.location 里 它不会显示在地址栏

    const {id,title} = this.props.location.state

    完整代码:

    Case/New

    1. import React, { Component } from 'react'
    2. import { Link,Route } from 'react-router-dom'
    3. import Detail from './Detail'
    4. export default class New extends Component {
    5. state={
    6. NewArr:[
    7. {id:"101",title:'新闻1'},
    8. {id:"201",title:'新闻2'},
    9. {id:"301",title:'新闻3'}
    10. ]
    11. }
    12. pushS = (id,title) =>{
    13. // push跳转 携带 state参数
    14. this.props.history.push('/case/new/detail',{id,title})
    15. // search
    16. //this.props.history.push(`/case/new/detail?id=${id}&title=${title}`)
    17. // params
    18. //this.props.history.push(`/case/new/detail/${id}/${title}`)
    19. }
    20. replaceS = (id,title) => {
    21. // replace跳转 携带 state参数
    22. this.props.history.replace('/case/new/detail',{id,title})
    23. // search
    24. //this.props.history.replace(`/case/new/detail?id=${id}&title=${title}`)
    25. // params
    26. //this.props.history.push(`/case/new/detail/${id}/${title}`)
    27. }
    28. render() {
    29. const {NewArr} = this.state
    30. return (
    31. <div>
    32. <ul>
    33. {
    34. NewArr.map((x) =>{
    35. return (
    36. <li key={x.id}>
    37. {/**
    38. * 向组件传递 params 参数
    39. * <Link to={`/case/new/detail/${x.id}/${x.title}`}>{x.title}Link>
    40. * 向组件传递 search 参数
    41. * <Link to={`/case/new/detail?id=${x.id}&title=${x.title}`}>{x.title}Link>
    42. * state
    43. *
    44. */}
    45. <Link to={{pathname:'/case/new/detail',state:{id:x.id,title:x.title}}}>{x.title}Link>
    46. <button onClick={() => this.pushS(x.id,x.title)}>push编程跳转路由button>
    47. <button onClick={() => this.replaceS(x.id,x.title)}>replace编程跳转路由button>
    48. li>
    49. )
    50. })
    51. }
    52. ul>
    53. <hr />
    54. {/** 声明接收 params 参数
    55. * <Route path="/case/new/detail/:id/:title" component={Detail}>Route>
    56. * search 参数无需声明接收 正常注册路由即可
    57. * state 参数无需声明接收 正常注册路由即可
    58. *
    59. */}
    60. <Route path="/case/new/detail" component={Detail}>Route>
    61. div>
    62. )
    63. }
    64. }

     Detail:

    1. import React, { Component } from 'react'
    2. //import qs from 'querystring'
    3. const DetailData = [
    4. {id:"101",context:'鼎立中原'},
    5. {id:"201",context:'哑铃战术'},
    6. {id:"301",context:'西南追歼'},
    7. ]
    8. export default class Detail extends Component {
    9. render() {
    10. console.log(this.props)
    11. // 接收params 参数
    12. // const {id,title} = this.props.match.params
    13. // 接收 search 参数
    14. // const {search} = this.props.location
    15. // const {id,title} = qs.parse(search.slice(1))
    16. // 接收 state 参数
    17. const {id,title} = this.props.location.state
    18. const findRes = DetailData.find(x =>{
    19. return x.id === id
    20. })
    21. return (
    22. <ul>
    23. <li>ID:{id}li>
    24. <li>TITLE:{title}li>
    25. <li>{JSON.stringify(findRes)}li>
    26. ul>
    27. )
    28. }
    29. }

    编程式路由

    之前都是通过 Link  NavLink 来实现跳转 这是声明式导航

    也可以利用API实现 编程式导航

    使用场景:满足条件自动跳转、定时器事件满后自动跳转......

    • this.props.history.push() push 跳转(压栈)有记录
    • this.props.history.replace() replace 跳转 直接替换

    • this.props.history.goBack() 退后一步

    • this.props.history.goForward() 前进一步

    • this.props.history.go() 填写数字 正数前进 负数退后

     也可以 携带 三种参数

    1. pushS = (id,title) =>{
    2. // push跳转 携带 state参数
    3. this.props.history.push('/case/new/detail',{id,title})
    4. // search
    5. //this.props.history.push(`/case/new/detail?id=${id}&title=${title}`)
    6. // params
    7. //this.props.history.push(`/case/new/detail/${id}/${title}`)
    8. }
    9. replaceS = (id,title) => {
    10. // replace跳转 携带 state参数
    11. this.props.history.replace('/case/new/detail',{id,title})
    12. // search
    13. //this.props.history.replace(`/case/new/detail?id=${id}&title=${title}`)
    14. // params
    15. //this.props.history.push(`/case/new/detail/${id}/${title}`)
    16. }
  • 相关阅读:
    巧用前缀和
    计算机网络体系结构图解
    Windbg常用命令详解
    玩转数组高级技法,成为JS高手
    书生·浦语大模型实战营第二期作业六
    C++ Primer Plus 第七章笔记
    Ansys Zemax | 如何设计光谱仪——理论依据
    Docker快速入门指南
    [C语言、C++]数据结构作业:用递归实现走迷宫(打印正确通路即可)
    SpringBootConfiguration注解的简介说明
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126828305