了解 window.history 和 window.location, 更好地掌握 vue-router、react-router单页面路由

在 JavaScript 中,History 是浏览器提供的一个内置对象(通过 window.history 访问),用于管理浏览器的会话历史记录(即用户浏览过的页面序列)。它是实现无刷新页面跳转(如单页应用 SPA 的路由)的核心工具,同时也支持传统的前进、后退等操作。

刷新页面 与 不刷新页面?

history 对象的语境中,"刷新页面" 和 "不刷新页面" 指的是修改 URL 或导航时是否触发浏览器重新加载页面

刷新页面(传统导航)

刷新页面,浏览器会重新请求服务器并加载新页面,整个页面会刷新(白屏后重新渲染)。这是传统多页应用的默认行为。

会刷新页面的方法

  • location.assign(url),跳转到指定的 url(与 location.href = url 效果相同),会在历史记录中添加新记录(可后退)。
  • location.reload(forceReload),刷新当前页面,不改变历史记录。
  • location.replace(url),跳转到指定的 url,但替换当前历史记录(不会新增记录,无法后退到当前页)。

不刷新页面(SPA 无刷新导航)

不刷新页面,浏览器不会重新请求服务器,页面内容可通过 JavaScript 动态更新。修改 URL 和历史记录,但不触发页面刷新。这是单页应用(SPA)实现无刷新路由的核心原理。

不刷新页面的 history 方法:

  • history.pushState(state, title, url):添加新的历史记录,更新 URL,但不刷新页面。
  • history.replaceState(state, title, url):替换当前历史记录,更新 URL,同样不刷新页面。

History

在单页应用(SPA)中,history.go(n)history.forward()(以及 history.back())默认不会「重新加载整个页面」 ------ 它们只是切换浏览器历史记录栈中的条目,复用已缓存的页面资源,仅在特殊场景下才会触发刷新。

txt 复制代码
http://localhost:5173/yo/home

location

txt 复制代码
http://localhost:5173/yo/home

popstate 事件(监听历史记录变化)

popstate 仅在「历史记录栈发生变化」且「不是新增记录」时触发 。当用户通过 浏览器前进 / 后退按钮,或通过 back()/forward()/go() 方法切换历史记录时触发。

注意 1、调用 pushStatereplaceState不会触发此事件。 2、首次加载页面(无历史记录变更),不触发。

hashchange 事件

hashchange 事件是 JavaScript 中用于监听浏览器地址栏中 Hash 部分变化 的事件。

vue-router v4/v5 、react-routerv6 已经不再监听 hashchange事件了。

hashchange 触发场景:

  1. 手动修改地址栏中的 Hash 并回车(如从 #/home 改为 #/about)。
  2. 点击页面中带有 Hash 的链接(如 <a href="#/contact">联系我们</a>)。
  3. 通过 JavaScript 修改 location.hash(如 location.hash = '#/login')。

hashchange 不会触发的场景:

  • history.pushStatehistory.replaceState 方法执行不会触发。
  • 页面首次记载不会触发。
相关推荐
whinc39 分钟前
Node.js技术周刊 2026年第16周
前端·javascript
DyLatte42 分钟前
我做了个AI项目后才发现:会做事的人,正在输给会讲故事的人
前端·后端·程序员
深海鱼在掘金42 分钟前
从Claude Code泄露源码看工程架构:第三章 — CLI 启动链路的分流策略与按需加载机制
前端·人工智能·设计模式
踩着两条虫42 分钟前
VTJ:低代码平台原理
前端·低代码·ai编程
颜酱44 分钟前
提示词强化1:三个让大模型更「听话」的习惯
前端·javascript·人工智能
破茧成蝶81044 分钟前
修复播报缺失文字的bug,改为“播放单个 -> 等待结束 -> 延迟 10ms秒 -> 播放下一个”的递归/循环模式
前端
颜酱1 小时前
提示词强化 2:元提示(Meta-Prompt)与动态提示词
前端·javascript·人工智能
fengci.1 小时前
ctfshow其他(web408-web432)
android·开发语言·前端·学习·php
研☆香1 小时前
es6的一些更新特点介绍
前端·ecmascript·es6
hlvy1 小时前
Claude Code 太难看?我开源了一个 Web GUI
前端·ai·claude