HashRouter和BrowserRouter对比

HashRouter(基于#号的路由)

路由工作原理

  • #号后的内容不会被浏览器发送给服务器,前端路由控制页面跳转

查询参数获取

  • 如果查询参数在#号前,如https://page.1688.com/?a=1#/home,需要使用window.location.search
js 复制代码
const params = new URLSearchParams(window.location.search)
console.log(params.get('a)) 
  • 如果查询参数在#号后面,如http://page.1688.com/#/home?a=1
    可以使用useSearchParams钩子函数
js 复制代码
import { useSearchParams } from 'react-router-dom';

const [searchParams] = useSearchParams();
console.log(searchParams.get('a')); // ✅ 解析 a

BrowserRouter(基于HTML5 History API 的路由)

路由工作原理

  • 依赖浏览器的History API(pushState / replaceState)
  • 更优雅,SEO友好,但是如果后端未配置,会导致刷新404

查询参数获取

直接使用useSearchParams或者使用window.location.search都可以

js 复制代码
import { useSearchParams } from 'react-router-dom';

const [searchParams] = useSearchParams();
console.log(searchParams.get('a')); // ✅ 解析 a

const params = new URLSearchParams(window.location.search);
console.log(params.get('a')); // ✅ 解析 a

结论

  1. 如果是 HashRouter

    • 查询参数在 # 号前 → 用 window.location.search 解析

    • 查询参数在 # 号后 → 用 useSearchParams() 或手动解析 window.location.hash

    • 推荐 修改跳转 URL,使查询参数放在 #/home?a=1 位置,方便 useSearchParams 解析。

  2. 如果是 BrowserRouter

    • 直接用 useSearchParams() 或 window.location.search 解析,无需特殊处理。

    • 需要后端支持 URL 解析,否则刷新可能会 404。

相关推荐
Bacon几秒前
CDP、Puppeteer 与无头浏览器:它们到底什么关系?
前端·javascript·node.js
kyriewen几秒前
你的网站被“下毒”了?XSS和CSRF:前端安全的两大“毒瘤”
前端·javascript·安全
Irene19911 分钟前
Web前端开发转行大数据开发,可行性分析及学习路线
大数据·前端·转行
咸鱼翻身了么2 分钟前
大文件上传-spark-md5
前端·后端
API快乐传递者2 分钟前
Python 爬虫获取 1688 商品详情 API 接口实战指南
java·前端·python
PeterMap4 分钟前
Vue条件渲染详解:v-if、v-show用法与实战指南
前端·vue.js
Hilaku5 分钟前
别再用 JSON.parse 深拷贝了,聊聊 StructuredClone
前端·javascript·vue.js
暗不需求6 分钟前
手写 instanceof:从原型链聊聊 JS 的实例判断
前端·javascript
像我这样帅的人丶你还8 分钟前
🔥🔥🔥Next + Tiptap + Yjs + Hocuspocus实现文档协同
前端·node.js
opteOG8 分钟前
前端项目K8S配置
前端