程序员书籍笔记 程序员书籍笔记
  • HTML
  • CSS
  • JavaScript
  • 前端知识
  • Vue
  • MarkDown
  • git
  • Node.js
  • Linux
  • 51单片机
  • 四级
  • 第一学期课程
  • 操作系统
  • 计算机网络
  • 数据结构
  • 计算机组成原理
  • HTML5
  • Electron
  • 日记便签
  • 前端导航
GitHub (opens new window)
  • HTML
  • CSS
  • JavaScript
  • 前端知识
  • Vue
  • MarkDown
  • git
  • Node.js
  • Linux
  • 51单片机
  • 四级
  • 第一学期课程
  • 操作系统
  • 计算机网络
  • 数据结构
  • 计算机组成原理
  • HTML5
  • Electron
  • 日记便签
  • 前端导航
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

  • GO

  • 正则表达式

  • java

  • TypeScript

  • react

    • 组件
    • this指向
    • 受控组件
    • 组件通信
    • 案例及同级组件通信
    • Props和插槽
    • 生命周期
    • 路由
      • 路由
      • 单页面应用程序
      • React路由
      • 路由的简单自我实现
      • React-Router
      • 路由的执行过程
      • NavLink
      • Switch与404
      • 路由嵌套
      • 重定向
      • 编程式导航
      • 动态路由参数
      • 实现路由守卫
      • AuthRoute封装
    • 极客PC项目
    • 组件复用
    • hooks
    • hooks更多用法
    • Reudx
    • todo案例
    • react函数组件
    • 基本使用
  • 前端知识

  • jQuery

  • Python

  • C和C++

  • 前端和后端
  • react
yuadh
2022-08-02
目录

路由

# 路由

# 单页面应用程序

  • SPA 单页面应用程序,整个应用钟只有一个页面
  • MPA 多页面应用程序,整个应用中有很多页面

优势

  1. 加快页面响应速度,降低了对服务器的压力
  2. 更好的用户体验,运行更加流畅

缺点

  • 不利于 SEO 搜索引擎优化

# React路由

为了有效的使用单个页面来管理原来多页面功能,前端路由应运而生

前端路由是一套映射关系:锚点值和组件的映射

# 路由的简单自我实现

当锚点值发送改变时,会触发一个 hashchange 事件

componentDidMount(){
    window.addEventListener('hashchange',()=>{
        this.setState({
            currentHash:window.location.hash.slice(1)
        })
    })
}
1
2
3
4
5
6
7

对 state 存储的 currentHash 值进行判断做出对应的组件显示

{currentHash === '/home'&&<home></home>}
{currentHash === '/my'&&<my></my>}
{currentHash === '/f'&&<f></f>}
1
2
3

# React-Router

下载对应的包模块

npm install react-router-dom 下载 web 开发的路由包

import {HashRouter,Link,Route} from 'react-router-dom'

return (
	<HashRouter>
    	<Link to="/home">首页</Link>
        <Link to="/my">我的</Link>
        <Link to="/friend">朋友</Link>
    	<Route path = "/home" component={Home}><Route>
    	<Route path = "/my" component={My}><Route>
        <Route path = "/friend" component={Friend}><Route>
    </HashRouter>
)
1
2
3
4
5
6
7
8
9
10
11
12
  • Link 路由导航链接
  • Route 路由指定规则
  • HashRouter 路由入口

router 包还提供了一个 BrowserRouter 替代 HashRouter 不会显示锚

# 路由的执行过程

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

# NavLink

Link 组件最终会渲染为 a 标签,用于指定路由导航

  • to 属性
  • 无法展示高亮

NavLink 组件,一个更特殊的 Link 组件,可以用于指定当前导航的高亮

  • to 属性
  • activeClass 用于指定高亮的类名,默认的类名为 active
  • exact 精准匹配,表示必须精准匹配类名才生效(根节点)

# Switch与404

这是 react-router-dom 提供的一个组件

在 Switch 组件中,不管有多少个路由规则,只会渲染匹配到的第一个路由规则

因此,通过 Switch 组件非常容易的实现 404 错误页面的显示

<Switch>
	<Route path = "/home" component={Home}><Route>
   	<Route path = "/my" component={My}><Route>
    <Route path = "/friend" component={Friend}><Route>
    <Route component={NoMatch}><Route>
</Switch>
1
2
3
4
5
6

# 路由嵌套

路由的嵌套和一级路由的使用类似

<Route path = "/my/list" component={List}><Route>
1

需要注意的是

  • 路由的嵌套不需要导入 HashRouter ,已经有路由入口了
  • 路由的嵌套需要加上父级路由的地址,才能匹配到子路由

# 重定向

Redirect 由路由提供的重定向组件

<Redirect exact from="/" to="/home"></Redirect>
1

# 编程式导航

在使用 Router 路由规则的使用,会给加载的组件传递三个参数

  • history 是 React 路由提供的,用于获取浏览器历史记录的相关信息
  • push(path) : 跳转到某个页面,参数 path 表示要跳转的路径
  • go(n) : 前进或后退到某个页面,参数 n 表示前进或后退的页面数量
handleClick= ()=>{
    this.props.history.push('./home')
    this.props.history.go(-1)
}
1
2
3
4

# 动态路由参数

<Router path="/detail/:id" component={Detail}> </Router>
1

const {match}=this.props

<div>{match.params.id}</div>
1

可以获取到动态路由的参数

# 实现路由守卫

<Route path = '/login' render = {(props)=><Login {...props}/>></Route>
1

# AuthRoute封装

基本结构

export default class AuthRoute extends Component{
  render(){
    const {component:Component,...rest} = this.props
    return (
    	<Route {...rest}
  		 render = {(props)=>{
         if(hasToken()){
            return <Component {...props}/>
         }else{
           	return <Redirect to='/login'/>
         }
       }}>
      </Route>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
编辑 (opens new window)
上次更新: 2023/02/07, 14:51:48
生命周期
极客PC项目

← 生命周期 极客PC项目→

Theme by Vdoing | Copyright © 2021-2023 yuadh
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×