React-Router中的HashRouter和BrowserRouter

本文介绍了前端路由react-router的实现方式,包括hash模式和history模式。hash模式通过监听浏览器地址hash值变化执行js切换,history模式利用H5 history API实现url和网页内容改变。还对比了HashRouter和BrowserRouter的区别,如底层原理、地址栏表现及对路由state参数的影响等。

什么是react-router


前端路由实现方式
路由需要实现三个功能:

当浏览器地址变化时,切换页面;
点击浏览器后退,前进按钮,网页内容发生变化;
刷新浏览器,页面加载内容对应当前路由对应的地址;

在单页面web网页中,单纯的浏览器地址改变,网页不会重载,如单纯的hash值改变,网页是不会变化的,因此我们的路由需要监听事件,并利用js实现动态改变网页。

  • hash 模式:监听浏览器地址hash值变化,并执行相应的js切换。
  • history 模式:利用H5 history API实现url地址改变,网页内容改变。
hash模式

使用window.location.hash 属性和window.onhashchange事件。可以监听浏览器hash值得变化,去执行相应的js切换网页

hash路由实现原理:

hash 指的是地址中 # 号以及后面的字符。称为散列值。
散列值不会随请求发送到服务器端的,所以改变hash,不会重新加载界面。
监听onhashchange事件,hash改变时,可以通过window.location.hash来获取和设置hash值。
location.hash值的变化直接反应在浏览器的地址栏。


history模式

我们使用history首先应该了解window.history对象。它表示的是当前窗口的浏览历史,当发生改变时,只会改变路径,不会刷新界面。
History对象就是一个堆栈
方法:

History.back:移动上一个网址,等同于浏览器的后退。
History.forward:移动到下一个网址,等同于浏览器前进。
History.go:接受一个参数,以当前网页为基准,来进行跳转。默认history.go(0),刷新当前界面。history.go(1) 相当于history.forward();
History.pushState():往history堆栈中添加一条记录。不会刷新界面,只会导致History对象变化,地址栏发生变化。
History.replaceState():是替换当前history堆栈中最上层的记录,也是不会刷新界面,只会是Histoty对象变化,地址栏发生变化,每当history对象发生变化,就会触发popstate事件:window.addEventListener("popstate",function(){})
只调用pushState或者replaceState是不会触发改事件的,只有调用back,forward,go才会触发该事件。
至此我们也能想到BrowserHisory是怎么利用History的API来实现url改变,网页内容发生改变。

HashRouter和BrowserRouter的区别
底层原理不一样:
BrowserRouter调用的是H5 history API,低版本兼容性问题。
HashRouter 使用的是URL哈希值

地址栏表现形式不一样:
BrowserRouter的路径:localhost:3000/demo/a
HashRouter的路径:localhost:3000/#/demo/a

刷新后对路由state参数的影响
BrowserRouter没有任何影响,因为state保存在history对象中
HashRouter刷新后会导致路由state参数的丢失!!!

官方会更推荐使用browserRouter,貌似是因为其构建于H5的History API,比起hashRouter,它多出了更多的方法操控url
建议:前端路由使用HashRouter ,服务路由使用BrowerRouter

### 两者的主要区别 `npm install react-router-dom` `npm i react-router` 是两个用于安装不同版本用途的 React 路由库的命令。以下是它们之间的主要区别: #### 1. **适用平台** - `react-router-dom` 是专门为 Web 平台设计的路由库[^1]。它提供了与浏览器交互的功能,例如 `BrowserRouter`、`HashRouter` 等组件。 - `react-router` 是一个更通用的核心库,适用于所有平台(包括 Web、Native 等)。它是 `react-router-dom` `react-router-native` 的基础[^3]。 #### 2. **依赖关系** - 安装 `react-router-dom` 时,`react-router` 会被作为其依赖项自动安装[^1]。因此,`react-router-dom` 包含了 `react-router` 的功能,并在此基础上添加了针对 Web 的特定功能。 - 如果单独安装 `react-router`,则不会包含任何特定于 Web 或 Native 的功能,需要根据需求手动选择其他扩展包(如 `react-router-dom` 或 `react-router-native`)[^3]。 #### 3. **功能差异** - `react-router-dom` 提供了专门用于 Web 开发的组件,例如 `BrowserRouter` `HashRouter`,这些组件利用了浏览器的历史 API URL 哈希值来管理路由[^2]。 - `react-router` 只提供核心功能,例如 `MemoryRouter` `Prompt` 等,不包含任何与浏览器或原生环境相关的特定实现[^4]。 #### 4. **安装命令** - `npm install react-router-dom`:安装 `react-router-dom` 及其依赖项 `react-router`。 - `npm i react-router`:仅安装核心库 `react-router`,不包含任何平台特定的功能。 #### 示例代码 以下是一个使用 `react-router-dom` 的简单示例: ```javascript import React from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; function App() { return ( <Router> <Switch> <Route path="/" component={Home} /> </Switch> </Router> ); } export default App; ``` 而如果使用 `react-router`,则需要手动选择合适的路由器组件,例如 `MemoryRouter`: ```javascript import React from 'react'; import { MemoryRouter as Router, Route, Switch } from 'react-router'; function App() { return ( <Router> <Switch> <Route path="/" component={Home} /> </Switch> </Router> ); } export default App; ``` ### 结论 对于 Web 开发,推荐使用 `react-router-dom`,因为它包含了所有必要的 Web 特定功能[^2]。而对于跨平台开发或需要自定义路由器的情况,可以选择安装 `react-router` 并根据需求扩展其功能[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值