目录

单页应用程序 SPA:

路由:

前端路由:

后端路由:

路由的基本使用

使用步骤

常用组件说明

BrowserRouter和HashRouter的区别

路由的执行过程

默认路由

精确匹配

Switch的使用

重定向路由

嵌套路由

向路由组件传递参数

1.params参数

2.search参数

3.state参数

编程式路由导航

withRouter

单页应用程序 SPA:

  1. 整个应用只有一个完整的页面
  2. 点击页面中的链接不会刷新页面,只会做页面的局部更新
  3. 数据都需要通过ajax请求获取, 并在前端异步展现。

路由:

前端路由:

  • 浏览器端路由,value是component,用于展示页面内容
  • 注册路由: <Route path="/test" component={Test}>
  • 工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件

后端路由:

  • 理解: value是function, 用来处理客户端提交的请求。
  • 注册路由: router.get(path, function(req, res))
  • 工作过程:当node接收到一个请求时, 根据请求路径和方法找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据

一个路由就是一个映射关系(key:value)

key为路径, value可能是function或component

路由的基本使用

使用步骤

  • 安装:react-router-dom
  • 导入路由的三个核心组件:Router/Route/Link
    import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
  • 使用Router 组件包裹整个应用(重要)
<Router><div className="App">//...</div>
</Router>
  • 使用Link 组件作为导航菜单(路由入口)
<Link to="/first">页面一</Link> 
  • 使用Route 组件配置路由规则和要展示的组件(路由出口)
const First = () => <p>页面一的页面内容</p>
<Router><div className="App"><Link to="/first">页面一</Link><Route path="/first" component={First}></Route></div>
</Router>

常用组件说明

  • Router组件:包裹整个应用,一个React应用只需要使用一次
  • 两种常用Router:HashRouter和BrowserRouter
  • HsahRouter:使用URL的哈希值实现(localhost:3000/#/first)
  • (推荐)BrowserRouter:使用H5的history API实现(localhost:3000/first)
  • Link组件:用于指定导航链接(a标签)

NavLink 标签是和 Link 标签作用相同的,但是它又比 Link 更加强大在之前案例中点击并没有高亮效果这时我们其实只需要对应设置active类名的样式即可因为当我们选中某个 NavLink 标签时,就会自动给当前标签添加active我们也可以通过activeClassName="zth"将激活时类名更改为zth.

  • Router组件:指定路由展示组件相关信息

BrowserRouter和HashRouter的区别

底层原理不一样:

  • BrowserRouter使用的是H5的````history``` API
  • HashRouter使用的是URL的哈希值。

url表现形式不一样:

  • BrowserRouter的路由中没有#符号
  • HashRouter的路由中有#符号

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

  • BrowserRouter对state参数没有任何影响,因为state保存在history对象中,只要浏览器不清空缓存数据或关闭
  • HashRouter对state参数有任何影响,state参数丢失。

路由的执行过程

  1. 点击Link组件(a标签),修改了浏览器地址栏中的url
  2. React路由监听到地址栏url的变化。
  3. React路由内部遍历所有Router组件,使用路由规则(path)与pathname进行匹配。
  4. 当路由规则(path)能够匹配地址栏中的pathname时,就展示该Router组件的内容

默认路由

  • 默认路由:表示进入页面时就会匹配的路由
  • 默认路由path为:/
  • 默认情况下,React路由是模糊匹配模式
  • 模糊匹配规则:只要pathname以path开头就会匹配成功

精确匹配

  • 给Route组件添加exact属性,让其变为精确匹配模式
  • 精确匹配:只有当pathpathname完全匹配时才会展示该路由

 推荐:给默认路由添加exact属性

//此时,该组件只能匹配pathname="/"这一种情况
<Route exact path="/" component=... />

Switch的使用

在注册路由表的时候,使用Switch标签,当匹配到指定路由后,就不继续往下匹配,提高效率。

import React,{ Component } from "react";
import { Route,Switch } from "react-router-dom";
import Home from "../../pages/Home";
import About from "../../pages/About";
import "./index.css";
export default class Center extends Component {render() {return (<div className="center"><h1>Center组件</h1>{/* 注册路由,使用Switch标签,当匹配到指定路由后,就不继续往下匹配,提高效率 */}<Switch><Route path='/home' component={Home}></Route><Route path='/about' component={About}></Route></Switch></div>)}
}

重定向路由

我们有时会发现我们需要去点击一个按钮才去匹配组件但我们想要页面一加载就默认匹配到一个组件(页面一加载就会去匹配路由)这个时候我们就需要时候 Redirecrt 进行默认匹配实现此需求一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到 Redirect 指定的路由。

import { Redirect } from 'react-router-dom';
<Switch><Route path="/about" component={About}/><Route path="/home" component={Home}/><Redirect to="/about"/>
</Switch>

嵌套路由

将嵌套内容写在相应的组件里面,这个是在 Home 组件的 return jsx的 内容注册子路由时要写上父路由的path值路由的匹配是按照注册路由的顺序进行的,我们是在Home组件注册的,所以匹配时会先去找Home组件,因为时模糊匹配所以会匹配成功在 Home 组件里面去匹配相应的路由,从而找到 /home/news 进行匹配,因此找到 News 组件。

进行匹配渲染如果开启精确匹配(exact属性的话,第一步的 /home/news 匹配 /home 就会卡住不动,就不会往Home组件里面去渲染嵌套的内容了

向路由组件传递参数

1.params参数

  • 路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>
  • 注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>
  • 接收参数:this.props.match.params

2.search参数

  • 路由链接(携带参数):<Link to='/demo/test?name=tom&age=18'}>详情</Link>
  • 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  • 接收参数:this.props.location.search
  • 备注:获取到的search是urlencoded编码字符串,需要借助querystring解析

3.state参数

  • 路由链接(携带参数):<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
  • 注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
  • 接收参数:this.props.location.state
  • 备注:刷新也可以保留住参数

编程式路由导航

我们可以采用绑定事件的方式实现路由的跳转,我们在按钮上绑定一个 onClick 事件,当事件触发时,我们执行一个回调 replaceShow

借助this.props.history对象上的API对操作路由跳转、前进、后退

  • ​ -this.props.history.push(path, state)
  • ​ -this.props.history.replace(path, state)
  • ​ -this.props.history.goBack()
  • ​ -this.props.history.goForward()
  • ​ -this.props.history.go()

withRouter

withRouter可以加工一般组件,让一般组件具备路由组件所特有的API,比如history 对象

withRouter返回值是一个新组件

import React, { Component } from "react";
import { withRouter } from "react-router-dom";class Header extends Component {back = () => {this.props.history.goBack();};forward = () => {this.props.history.goForward();};go = () => {this.props.history.go(-2);};render() {console.log("Header组件收到的props是", this.props);return (<div className="page-header"><h2>React Router Demo</h2><button onClick={this.back}>回退</button>&nbsp;<button onClick={this.forward}>前进</button>&nbsp;<button onClick={this.go}>go</button></div>);}
}
//在最后导出对象时,用 withRouter 函数进行包装
export default withRouter(Header);

【React】路由(详解)相关推荐

  1. RN和React路由详解及对比

    前言 在平时H5或者RN开发时,我们业务场景中大部分都不是单页面的需求,那这时我们就能使用路由在进行多页面的切换.下面会对比一下react路由和RN路由的本质区别和使用方法. 路由(routing)是 ...

  2. rn php,RN和React路由详解及对比

    前言 在平时H5或者RN开发时,我们业务场景中大部分都不是单页面的需求,那这时我们就能使用路由在进行多页面的切换.下面会对比一下react路由和RN路由的本质区别和使用方法. 路由(routing)是 ...

  3. React 路由详解(超详细详解)

    React React 路由 对SPA的理解 1.单页Web应用(single page web application,SPA). 2.整个应用只有一个完整的页面. 3.点击页面中的链接不会刷新页面 ...

  4. React Router路由详解

    React Router路由详解 一.基础 1.安装使用 2.React Router 中通用的组件 路由组件 BrowserRouter 和 HashRouter 路径匹配组件: Route 和 S ...

  5. Ocelot简易教程(三)之主要特性及路由详解

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...

  6. vue路由详解 --基础

    vue路由详解 --基础 1.router-link 和router-view组件 router-link相当于封装了一个a标签 router-view为组件显示的位置 <router-link ...

  7. React 源码系列 | React Context 详解

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...

  8. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    目录 一.分词器​ 1. 认识分词器 1.1 Analyzer 分析器 1.2 如何测试分词器 2. 内建的字符过滤器(character filter) 2.1 HTML过滤字符过滤器(HTML S ...

  9. angular路由详解

    angular路由 路由 (route) ,几乎所有的 MVC(VM) 框架都应该具有的特性,因为它是前端构建单页面应用 (SPA) 必不可少的组成部分. 那么,对于 angular 而言,它自然也有 ...

  10. 静态路由和默认路由详解及配置方法️

    目录 一.路由详解 1.路由器工作原理: 2.路由表形成: 3.直连路由: 4.非直连路由: 二.静态路由 1.静态路由详解: 2.配置静态路由 三. 默认路由: 1.默认路由详解 2.配置默认路由方 ...

最新文章

  1. IPhone鸿蒙系统,iPhone 13外观再次确认,鸿蒙系统也将临世,神仙又打架
  2. Lucene学习总结之二:Lucene的总体架构
  3. android+引用非+android+工程,[非原创]编译android C++工程找不到exception handle的解决办法...
  4. Docker下使用gdb
  5. 在xml publisher中嵌入二维码(支持中文)
  6. Atitit.java eval功能的实现  Compiler API
  7. 动态规划——Palindrome Partitioning II
  8. 字符串的unicode java_Java把字符串转Unicode
  9. 二进制转四进制计算机,计算机进制转换方法
  10. windows 微信手机端退出登录,pc电脑端不退出的奇淫技巧
  11. 世界三大数学猜想 哥德巴赫猜想 费马大定理: 费马猜想: 质数算法c++ 1.NP完全问题 2.霍奇猜想 3.庞加莱猜想 4.黎曼假设 5.杨-米尔斯存在性和质量缺口 6.纳卫尔-
  12. 解决only integer scalar arrays can be converted to a scalar index
  13. JMeter工具:场景设计,场景设置,场景运行,性能参数配置,测试监控
  14. opencv 应用程序无法正常启动0xc000007b
  15. OptaPlanner快速开始
  16. c语言调查问卷统计方法,C语言程序教学的问卷调查分析与教学改革.doc
  17. Word - Word快速去水印的 3 大绝招,再忙也要看
  18. cmd/bat 批处理文件(干货)
  19. 编码、解码、总结大全
  20. CAD室内设计构思怎么写?

热门文章

  1. 15 | 边界:微服务的各种边界在架构演进中的作用
  2. Linux 管道命令的使用方法
  3. 【网络安全面经】渗透面经、安服面经、红队面经、hw面经应有尽有 这一篇真的够了
  4. Linux下的软连接和硬链接
  5. 2014以及未来几年编程语言趋势
  6. Fast R-CNN网络结构详解
  7. linux 提取网卡驱动,韦东山-Linux下移植wifi网卡驱动(RTL8723) - 百问网嵌入式问答社区...
  8. iPhone4的home键失灵解救方法集锦
  9. 小程序分享给好友列表以及分享到朋友圈
  10. 购买的专利可以用来申报国家高新技术企业吗?