React router 基础介绍

1,142 阅读3分钟

React Router 种类

BrowserHistory

  • 操作我们BOM对象(window对象)上的history实现的

  • 该路由的切换原理是通过pushState()replaceState() 方法来增加或替换历史记录,这个是H5提出来的因此会不兼容旧浏览器

HashHistory

  • URL的哈希值
  • hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件,兼容性良好

区别

  • HashHistory 在浏览器的地址栏上有一个# 例如:https://juejin.cn/#/xxx
  • BrowserHistory 在我们点击刷新按钮的时候会根据路由地址请求网络的,但 HashRouter 不会、
  • 兼容性 HasHistory

React Router组件种类和作用

Link

  • 用于路由跳转 这里的 to参数传递路由地址 于此相同的还有 NavLink

Route

  • 用于路由匹配 当path中的地址和Link组件中的to的地址一样 去渲染相应的组件
  • React 开启的是模糊匹配 如果需要开启精准匹配 添加 exact={true}

Switch

  • 用于阻止路由匹配的过程中 匹配到之后不会向下匹配

Redirect

  • 重定向, 当路由匹配不到结果的时候就回去重定向到该路径 App.jsx:
import React, { Component } from 'react'
import { Link,Route,Switch,Redirect,NavLink } from 'react-router-dom'
import Home from './page/Home'
import User from './page/User'

// Link :用于路由跳转 这里的 to参数传递路由地址 于此相同的还有 NavLink
// Route : 用于路由匹配 当path中的地址和Link组件中的to的地址一样 去渲染相应的组件
// Switch : 用于阻止路由匹配的过程中 匹配到之后不会向下匹配
// Redirect : 重定向 当路由匹配不到结果的时候就回去重定向到该路径

export default class App extends Component {
    render() {
        return (
            <div>
                <Link to='/home'>Home</Link>
                <br></br>
                <NavLink to='/user'>User</NavLink>

                <Switch>
                {/* 
                   这样也是可以匹配的 因为React默认是模糊匹配                 
                  <Route path='/home/a/b' component={Home}></Route> 
                */}
                  <Route path='/user'component={User}></Route>
                  <Redirect to='/home'/>
                </Switch>
                </Switch>
            </div>
        )
    }
}

BrowserRouter

  • 表示该router 是 BrowserHistory 模式

HashRouter

  • 表示该router 是 HashHistory 模式 index.js:
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter,HashRouter } from 'react-router-dom';
import App from './App';

// BrowserRouter : 表示该router 是BrowserHistory 模式
// HashRouter :表示 该router 是HashHistory 模式

ReactDOM.render(
  <BrowserRouter>
     <App/>
  </BrowserRouter>,
  document.getElementById('root')
);

BrowserRouter 和 HashRouter 的区别

  • 原理不同 BrowserRouterBrowserHistory ,HashRouterHashHistory

  • 浏览器地址栏 path 表现形式不同 HashRouter 地址栏带#

  • 刷新后对state参数的影响

    • BrowserRouter 无影响,因为state 保存在 history 对象中

    • HashRouter 刷新之后 state 参数丢失

React Route 传递参数

params参数

  • 路由链接(携带参数): <Link to='/user/tome/18'>User</Link>

  • 编程式路由导航:this.props.history.push('/user/${name}/${age}')

  • 注册路由(接受参数):<Route path='/user/:name/:age' component={User}></Route>

  • 组件接收参数: const {name,age} = this.props.match.params

search

  • 路由链接(携带参数): <Link to='/user?name=tome&age=18'>User</Link>

  • 编程式路由导航:

this.props.history.push(`/user?name={name}&age={age}`)

  • 注册路由(正常组册无需声明):<Route path='/user' component={User}></Route>

  • 组件接收参数:

User.jsx:

import React, { Component } from 'react'
import qs from 'querystring'

export default class User extends Component {
    
    render() {
        const {search} = this.props.location
        // qs.parse() key=value转为key:value .slice(1):重第一个位置提取后面的字符 
        const {name,age} = qs.parse(search.slice(1))
        return (
            <div>

                <h1>我是User名字是:{name}, 年龄:{age}</h1>
            </div>
        )
    }
}

state参数

  • 路由链接(携带参数): <Link to{{pathname:'/user',state{name:'tom',age:18}}}>User</Link>

  • 编程式路由导航:this.props.history.push('/use',{name,age})

  • 注册路由(接受参数):<Route path='/user' component={User}></Route>

  • 组件接收参数: const {name,age} = this.props.loaction.states

withRouter 的使用

  • withRouter 是 react-router-dom库提供的一个方法,这方法的作用就把一个一般组件可以加工为一个路由组件
 import React, { Component } from 'react'
import {withRouter} from 'react-router-dom'

//withRouter 是一个函数 返回值是一个具备history API的组件

class Header extends Component {
    render() {
        return (
            <div>
                
            </div>
        )
    }
}
export default withRouter(Header)