了解 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 方法执行不会触发。
  • 页面首次记载不会触发。
相关推荐
倾颜13 小时前
从 textarea 到 AI 输入框:用 Tiptap 实现 / 命令、@ 引用和结构化请求
前端·langchain·next.js
kyriewen14 小时前
程序员连夜带团队跑路,省了23万:这AI太贵,真的用不起了
前端·javascript·openai
kyriewen15 小时前
你写的代码没有测试,就像出门不锁门——Jest + Testing Library 从入门到不慌
前端·单元测试·jest
yuzhiboyouye15 小时前
web前端英语面试
前端·面试·状态模式
canonical_entropy17 小时前
下一代低代码渲染框架 nop-chaos-flux 的设计原则
前端·低代码·前端框架
东方小月17 小时前
5分钟搞懂Harness Engineering(驾驭工程):从提示词到AI Agent的进化之路
前端·后端·架构
我叫黑大帅17 小时前
为什么需要 @types/react?解决“无法找到模块 react 的声明文件”报错
前端·javascript·面试
之歆17 小时前
DAY_21JavaScript 深度解析:数组(Array)与函数(Function)(一)
前端·javascript
XinZong18 小时前
【AI社交】基于OpenClaw自研轻量化AI社交平台实战
前端
Le_ee18 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php