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。

相关推荐
小福气_4 分钟前
自定义组件 vue3+elementPlus
前端·javascript·vue.js
程序员博博5 分钟前
这才是vibe coding正确的打开方式 - 手把手教你开发一个MCP服务
javascript·人工智能·后端
piaoroumi7 分钟前
UVC调试
linux·运维·前端
前端不太难19 分钟前
RN 调试效率低,一点小改动就需要重新构建?解决手册(实战 / 脚本 / Demo)
前端·react native·重构
是谁眉眼21 分钟前
vue环境变量
前端·javascript·vue.js
3秒一个大22 分钟前
JSX 基本语法与 React 组件化思想
前端·react.js
鹏北海-RemHusband22 分钟前
Vue 组件解耦实践:用回调函数模式替代枚举类型传递
前端·javascript·vue.js
用户66006766853923 分钟前
斐波那契数列:从递归到缓存优化的极致拆解
前端·javascript·算法
NuLL23 分钟前
异步并行任务执行工具
javascript
海上彼尚26 分钟前
vite+vue3 ssg预渲染方案
前端·javascript·vue.js