React(7)—— SPA应用 - React路由机制 - react-router-dom

二、react-router-dom相关API

==========================================================================================

1. 内置组件


  1. <BrowserRouter/ >

  2. <HashRouter/ >

  3. <Route/ >

  4. <Redirect/ >

  5. <Link/ >

  6. <NavLink/ >

  7. <Switch/ >

2. 其它


  1. history对象

  2. match对象

  3. withRouter函数

三、路由的使用

==========================================================================

1. 效果


在这里插入图片描述

2. 准备


  1. 下载react-router-dom:

npm install react-router-dom

  1. 引入bootstrap.css:

3. 路由的基本使用


  1. 明确好界面中的导航区、展示区

  2. 导航区的a标签改为Link标签

< Link to="/xxxxx">Demo< /Link >

  1. 展示区写Route标签进行路径的匹配

< Route path='/xxxx' component={Demo}/ >

  1. < App/>的最外侧包裹了一个< BrowserRouter>< HashRouter >

4. 实现


index.js

这里用一个标签将整个App包起来,保证使用的是同一个路由器

//引入react核心库

import React from ‘react’

//引入ReactDOM

import ReactDOM from ‘react-dom’

//

import {BrowserRouter} from ‘react-router-dom’

//引入App

import App from ‘./App’

ReactDOM.render(

,

document.getElementById(‘root’)

)

App.jsx

import React, { Component } from ‘react’

import { Link,Route } from ‘react-router-dom’

import Home from ‘./Home’

import About from ‘./About’

export default class App extends Component {

render() {

return (

React Router Demo

{/* 原生html中,靠跳转不同的页面 */}

{/* About

Home */}

{/* 在React中靠路由链接实现切换组件–编写路由链接 */}

About Home

{/* 注册路由 */}

)

}

}

5. 路由组件与一般组件的区别


  1. 写法不同

一般组件:<Demo/>

路由组件:<Route path="/demo" component={Demo}/>

  1. 存放位置不同

一般组件:components

路由组件:pages

  1. 接收到的props不同

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

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

history:

go: ƒ go(n)

goBack: ƒ goBack()

goForward: ƒ goForward()

push: ƒ push(path, state)

replace: ƒ replace(path, state)

location:

pathname: “/about”

search: “”

state: undefined

match:

params: {}

path: “/about”

url: “/about”

6. NavLink与封装NavLink


NavLink可以实现路由链接的高亮,通过activeClassName属性指定样式名,默认是"active"

Home

可以自己封装一个NavLink【一般组件】

import React, { Component } from ‘react’

import {NavLink} from ‘react-router-dom’

export default class MyNavLink extends Component {

render() {

// console.log(this.props);

return (

<NavLik activeClassName=“demo” className=“list-group-item” {…this.props} />

)

}

}

标签体内容是特殊的标签属性通过this.props.children可以获取标签体内容

使用

About

Home

7. Switch的使用


  1. 通常情况下,path和component是一一对应的关系。

  2. Switch可以提高路由匹配效率(单一匹配)。

这样只要匹配到了第一个就不会再往下匹配了

8. 解决多级路径刷新页面样式丢失的问题


  1. public/index.html 中 引入样式时不写.// (常用)【绝对路径】

  2. public/index.html 中 引入样式时不写./%PUBLIC_URL% (常用)

  3. 使用HashRouter

9. 路由的严格匹配与模糊匹配


  1. 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)

  2. 开启严格匹配:<Route exact={true} path="/about" component={About}/>

  3. 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由

10. Redirect的使用 【重定向】


一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由

具体编码:

四、嵌套路由使用

===========================================================================

1. 最终效果


在这里插入图片描述

2. 注意


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

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

3. 实现


Home/index.jsx

import React, { Component } from ‘react’

import { Route, NavLink,Redirect,Switch } from ‘react-router-dom’

import News from ‘./News’

import Message from ‘./Message’

export default class Home extends Component {

render() {

return (

我是Home的内容

    • News

    • Message

      )

      }

      }

      五、向路由组件传递参数数据

      ================================================================================

      1. 效果


      在这里插入图片描述

      2. 具体方法


      方法1. params参数

      1. 路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>

      2. 注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>

      3. 接收参数:this.props.match.params

      Message/index.jsx

      import React, { Component } from ‘react’

      import { Link, Route } from ‘react-router-dom’;

      import Detail from ‘./Detail’;

      export default class Message extends Component {

      state = {

      messageArr: [

      { id: ‘01’, title: ‘消息1’ },

      { id: ‘02’, title: ‘消息2’ },

      { id: ‘03’, title: ‘消息3’ },

      ]

      }

      render() {

      const { messageArr } = this.state;

      return (

        {

        messageArr.map((msgObj) => {

        return (

      • {/* 向路由组件传递params参数 */}

        {msgObj.title}

        )

        })

        }


        {/* 声明接收params参数 */}

        )

        }

        }

        Detail/index.jsx

        import React, { Component } from ‘react’

        export default class Detail extends Component {

        state = {

        detailData : [

        { id: ‘01’, content: ‘你好啊’ },

        { id: ‘02’, content: ‘还不错鸭’ },

        { id: ‘03’, content: ‘显示我吧’ }

        ]

        }

        render() {

        console.log(this.props)

        // 接收params参数

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

        const findResult= this.state.detailData.find((dataObj) => {

        return dataObj.id === id

        })

        return (

        • ID: {id }
        • Title: {title }
        • Content: { findResult.content}
        • )

          }

          }

          在这里插入图片描述

          方法2. search参数

          1. 路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>

          2. 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>

          3. 接收参数:this.props.location.search

          4. 备注:获取到的searchurlencoded编码字符串,需要借助querystring解析

          import qs from ‘querystring’

          let obj = {name:‘tom’, age:18}

          console.log(qs.stringify(obj)) // name=tom&age=18

          let str = ‘carName=Benz&price=199’
          自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

          深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

          因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

          img

          既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

          由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

          如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

          最后

          javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

          资料领取方式:点击这里免费领取前端全套学习资料

          css源码pdf

          JavaScript知识点
          前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

          [外链图片转存中…(img-xDYxuIa3-1713554401791)]

          [外链图片转存中…(img-tZ4VtTHR-1713554401792)]

          既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

          [外链图片转存中…(img-rRtRJWEk-1713554401792)]

          由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

          如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

          [外链图片转存中…(img-I81Vg83Y-1713554401792)]

          最后

          javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

          资料领取方式:点击这里免费领取前端全套学习资料

          [外链图片转存中…(img-PlKM3IzB-1713554401793)]

          [外链图片转存中…(img-v1M2W5VV-1713554401793)]

        • 27
          点赞
        • 18
          收藏
          觉得还不错? 一键收藏
        • 0
          评论
        React Router是一个用于建立SPA应用程序的库,它提供了一种将应用程序状态与URL同步的方式。React Router v6是React Router的最新版本,它引入了一些新的概念和语法。 下面是使用React Router v6搭建由的步骤: 1. 安装React Router v6 使用npm或者yarn安装React Router v6: ``` npm install react-router-dom@next ``` 2. 创建由 在应用程序的入口文件中,使用BrowserRouter创建一个由: ```jsx import { BrowserRouter } from 'react-router-dom'; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') ); ``` 3. 定义由 使用Route组件定义由。Route组件的path属性指定URL的径,component属性指定该径对应的组件: ```jsx import { Route } from 'react-router-dom'; function App() { return ( <div> <Route path="/" component={Home} /> <Route path="/about" component={About} /> </div> ); } ``` 在上面的例子中,当URL径为“/”时,渲染Home组件;当URL径为“/about”时,渲染About组件。 4. 处理404页面 使用Route组件的exact属性确保由匹配完全相等的径。这样可以避免在匹配“/”径时同时匹配到所有其他径。 使用Route组件的path属性指定“*”径,即匹配所有径的径。将这个Route组件放在所有其他Route组件的下面,就可以为未匹配到任何径的URL显示404页面: ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL径为任何未匹配到的径时,渲染NotFound组件。 5. 嵌套由 使用Routes组件嵌套Route组件,可以创建嵌套由。在嵌套由中,父级Route组件的path属性包含所有子级Route组件的path属性的前缀。 ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />}> <Route path="team" element={<Team />} /> <Route path="history" element={<History />} /> </Route> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL径为“/about/team”时,渲染Team组件;当URL径为“/about/history”时,渲染History组件。 React Router v6引入了一些新的语法,例如使用Routes组件代替Router组件,使用element属性代替component属性等。这些语法的目的是让React Router更加简洁易用。

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

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

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值