Blog
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)

HiuZing

🍑
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)
  • 前端面试题

  • JavaScript

  • Vue2

  • port

  • CSS

  • Node.js

  • JavaScript优化

  • uniapp

  • Mini Program

  • TypeScript

  • 面向对象编程

  • UI组件

  • Plugin

  • Vue3

  • 性能优化

  • Axios

  • 状态管理

  • React

    • 教程

      • React 简介
      • React 组件
      • React 应用
      • React AJAX
      • React Router5
        • 相关理解
          • SPA
          • 路由
        • 相关API
          • 内置组件
          • 其它
        • 基本路由使用
          • 基本使用
          • 路由组件与一般组件
          • NavLink与封装NavLink
          • Switch的使用
          • 解决多级路径刷新页面样式丢失的问题
          • 路由的严格匹配与模糊匹配
          • Redirect的使用
        • 嵌套路由使用
        • 向路由组件传递参数数据
        • 多种路由跳转方式
          • push和replace
          • 编程式导航
        • BrowserRouter与HashRouter的区别
      • React Redux
      • React 扩展内容
      • React Router6
      • React Router Hooks
      • React Hooks
    • 实战

  • Mock

  • Icon

  • Template

  • 构建工具

  • 项目规范配置

  • Taro

  • SVG

  • React Native

  • 前端
  • React
  • 教程
HiuZing
2023-05-02
目录

React Router5

# 相关理解

# SPA

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

# 路由

# 后端路由

  1. 理解: value是function, 用来处理客户端提交的请求。

  2. 注册路由:

    router.get(path, function(req, res))
    
    1
  3. 工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据

# 前端路由

  1. 浏览器端路由,value是component,用于展示页面内容。

  2. 注册路由:

    <Route path="/test" component={Test}>
    
    1
  3. 工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件

# 相关API

# 内置组件

  1. BrowserRouter
  2. HashRouter
  3. Route
  4. Redirect
  5. Link
  6. NavLink
  7. Switch

# 其它

  1. history对象
  2. match对象
  3. withRouter函数

# 基本路由使用

1.下载react-router-dom:

npm install --save react-router-dom
1

# 基本使用

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

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

    <Link to="/xxxxx">Demo</Link>
    
    1
  3. 展示区写Route标签进行路径的匹配

    <Route path='/xxxx' component={Demo}/>
    
    1
  4. App的最外侧包裹了一个<BrowserRouter>或<HashRouter>

<div className="list-group">
    {/*原生html,靠<a>跳转*/}
    {/*<a className="list-group-item active" href="./about.html">About</a>*/}
    {/*<a className="list-group-item" href="./home.html">Home</a>*/}

    {/*在React靠路由链接实现切换组件*/}
    <Link className="list-group-item" to="/about">About</Link>
    <Link className="list-group-item" to="/home">Home</Link>
</div>

<div className="panel-body">
    {/*注册路由*/}
    <Route path="/about" component={About}/>
    <Route path="/home" component={Home}/>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 路由组件与一般组件

1.写法不同: 一般组件:<Demo/> 路由组件:

<Route path="/demo" component={Demo}/>
1

2.存放位置不同: 一般组件:components 路由组件:pages 3.接收到的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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# NavLink与封装NavLink

NavLink可以实现路由链接的高亮,通过activeClassName指定样式名

import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'

export default class MyNavLink extends Component {
	render() {
		return (
			<NavLink activeClassName="atguigu" className="list-group-item" {...this.props}/>
		)
	}
}

<MyNavLink to="/about">About</MyNavLink> === <MyNavLink to="/about" children="About"/>
1
2
3
4
5
6
7
8
9
10
11
12

# Switch的使用

  1. 通常情况下,path和component是一一对应的关系。
  2. Switch可以提高路由匹配效率(单一匹配),匹配到了不再往下看。
<Switch>
    <Route path="/about" component={About}/>
	<Route path="/home" component={Home}/>
	<Route path="/home" component={Test}/>
</Switch>
1
2
3
4
5

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

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

# 路由的严格匹配与模糊匹配

  1. 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
  2. 开启严格匹配:<Route exact={true} path="/about" component={About}/>
  3. 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由

# Redirect的使用

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

    <Switch>
    	<Route path="/about" component={About}/>
    	<Route path="/home" component={Home}/>
    	<Redirect to="/about"/>
    </Switch>
    
    1
    2
    3
    4
    5

# 嵌套路由使用

  1. 注册子路由时要写上父路由的path值
  2. 路由的匹配是按照注册路由的顺序进行的
// App有两个路由组件Home和About
{/* 注册路由 */}
<Switch>
    <Route path="/about" component={About}/>
	<Route path="/home" component={Home}/>
	<Redirect to="/about"/>
</Switch>

// Home有两个路由组件News和Message
<MyNavLink to="/home/news">News</MyNavLink>
<MyNavLink to="/home/message">Message</MyNavLink>

{/* 注册路由 */}
<Switch>
    <Route path="/home/news" component={News}/>
	<Route path="/home/message" component={Message}/>
	<Redirect to="/home/news"/>
</Switch>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 向路由组件传递参数数据

  1. params参数

    1. 路由链接(携带参数):

      <Link to='/demo/test/tom/18'}>详情</Link>
      
      1
    2. 注册路由(声明接收):

      <Route path="/demo/test/:name/:age" component={Test}/>
      
      1
    3. 接收参数:

      this.props.match.params
      
      1
  2. search参数

    1. 路由链接(携带参数):

      <Link to='/demo/test?name=tom&age=18'}>详情</Link>
      
      1
    2. 注册路由(无需声明,正常注册即可):

      <Route path="/demo/test" component={Test}/>
      
      1
    3. 接收参数:

      this.props.location.search
      
      1
    4. 备注:获取到的search是urlencoded编码字符串,需要借助querystring解析

  3. state参数

    1. 路由链接(携带参数):

      <Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
      
      1
    2. 注册路由(无需声明,正常注册即可):

      <Route path="/demo/test" component={Test}/>
      
      1
    3. 接收参数:

      this.props.location.state
      
      1
    4. 备注:刷新也可以保留住参数

# 多种路由跳转方式

# push和replace

<MyNavLink replace to="/about">About</MyNavLink>
<MyNavLink replace to="/home">Home</MyNavLink>
1
2

# 编程式导航

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

  1. this.prosp.history.push()
  2. this.prosp.history.replace()
  3. this.prosp.history.goBack()
  4. this.prosp.history.goForward()
  5. this.prosp.history.go()

# BrowserRouter与HashRouter的区别

  1. 底层原理不一样:
    1. BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
    2. HashRouter使用的是URL的哈希值。
  2. path表现形式不一样
    1. BrowserRouter的路径中没有#,例如:localhost:3000/demo/test
    2. HashRouter的路径包含#,例如:localhost:3000/#/demo/test
  3. 刷新后对路由state参数的影响
    1. BrowserRouter没有任何影响,因为state保存在history对象中。
    2. HashRouter刷新后会导致路由state参数的丢失!!!
  4. 备注:HashRouter可以用于解决一些路径错误相关的问题。
#React
上次更新: 2024/08/14, 04:14:33
React AJAX
React Redux

← React AJAX React Redux→

最近更新
01
React Native 使用SVG
08-13
02
Docker基础命令
08-04
03
算数逻辑单元
07-30
更多文章>
Theme by Vdoing | Copyright © 2021-2024 WeiXiaojing | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式