React.js之react-router

前言

 当我刚刚开始接触react的时候,路由的跳转到底该使用react-router还是使用react-router-dom,这个是让我们很懵逼的,下面就先来说说react-router和react-router-dom的关系以及区别

(一)api的区别

  • react-router提供了router的核心api,如Router、Route、Switch等等,但是并没有提供相关dom操作的api
  • react-router-dom提供了通过dom触发的时间路由,例如BrowserRouter、Route、Link等

(二)功能的差异性

  • react-router-dom是基于react-router实现的,并且加入了一些浏览器运行的一些功能,
    例如:Link组件会渲染一个a标签,BrowserRouter使用 HTML5 提供的 history API可以保证你的 UI 界面和 URL 保持同步,HashRouter使用 URL 的 hash 部分保证你的 UI 界面和 URL 保持同步

所以综上所说因素,一般我们只要引入react-router-dom即可,react-router-dom会自动引入依赖库react-router,在react-router@v4.0版本以后,React Router被拆分成三个包:react-router,react-router-dom和react-router-native,目前网站搭建只需要引入react-router-dom即可,更多用法可以查看官网

1
2
3
yarn add react-router-dom
//或则
npm install react-router-dom

react-router-dom

(一) BrowserRouter与HashRouter

 HashRouter与BrowserRouter这两个路由是基本,我们需要将他们包裹在最外层,当然他们的内层也只能包裹一个元素,例如这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import {BrowserRouter as Router, HashRouter, Route} from "react-router-dom";

<HashRouter>
<div>
<Route exact path='/' component={Login}></Route>
<Route path='/home' component={Home}></Route>
</div>
</HashRouter>

//或则使用BrowserRouter这样

<Router>
<div>
<Route exact path='/' component={Login}></Route>
<Route path='/home' component={Home}></Route>
</div>
</Router>

在这里我们要说说HashRouter和BrowserRouter的区别

  • BrowserRouter使用HTML5历史记录API(pushState,replaceState和popstate事件)来保持您的UI与URL同步
  • HashRouter使用URL的哈希部分(即window.location.hash)来保持您的UI与URL同步,使得路径上会出现 # 键

(二) Route

Route 就像原材料,控制着我们应该对应显示的内容,也是最重要的路由组件
Route常用的属性,path、exact、component

  • path:对应的路径
  • exact:仅当路径与location.pathname完全匹配时才匹配,当匹配到路劲后就不会再往下匹配
  • component:对应要显示的组件
    app.js
    1
    2
    3
    4
    5
    6
    7
    8
    import {BrowserRouter as Router, HashRouter, Route} from "react-router-dom";
    <HashRouter>
    <div>
    /*一般这里都要加个exact,不然切换路径后,两个路径对应的组件都会被显示出来*/
    <Route exact path='/' component={Login}></Route>
    <Route path='/home' component={Home}></Route>
    </div>
    </HashRouter>

 Link与NavLink都是控制路由跳转的,当然NavLink所具有的功能比Link更多,所以,使用的时候视情况而定。控制路由跳转这只是其中的一种方法,我们也可以使用react-router里面的js方法实现跳转

1
2


先暂时写在这儿,等有时间再接着完善