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。

相关推荐
昔人'27 分钟前
`list-style-type: decimal-leading-zero;`在有序列表`<ol></ol>` 中将零添加到一位数前面
前端·javascript·html
岁月宁静6 小时前
深度定制:在 Vue 3.5 应用中集成流式 AI 写作助手的实践
前端·vue.js·人工智能
心易行者6 小时前
10天!前端用coze,后端用Trae IDE+Claude Code从0开始构建到平台上线
前端
saadiya~7 小时前
ECharts 实时数据平滑更新实践(含 WebSocket 模拟)
前端·javascript·echarts
fruge7 小时前
前端三驾马车(HTML/CSS/JS)核心概念深度解析
前端·css·html
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
烛阴7 小时前
Lua 模块的完整入门指南
前端·lua
浪里行舟8 小时前
国产OCR双雄对决?PaddleOCR-VL与DeepSeek-OCR全面解析
前端·后端
znhy@1238 小时前
CSS易忘属性
前端·css
瓜瓜怪兽亚9 小时前
前端基础知识---Ajax
前端·javascript·ajax