网站首页 > 技术文章 正文
在原生 JavaScript 中监听路由变化的方式主要分为两种场景:监听哈希(Hash)路由变化和监听 History API 的路由变化。Vue 框架本身并不直接处理路由监听,但 Vue 的官方路由库 vue-router 内部会封装这些原生机制。
一、原生 JavaScript 监听路由变化
1. 监听哈希(Hash)路由变化
当 URL 的哈希部分(# 后的内容)发生变化时,可以通过 hashchange 事件监听:
window.addEventListener('hashchange', () => {
const hash = window.location.hash; // 获取当前 hash
console.log('Hash changed to:', hash);
});
// 示例:修改 hash 触发事件
window.location.hash = 'new-hash';
2. 监听 History API 的路由变化
当使用 history.pushState() 或 history.replaceState() 修改路由时,需要通过以下方式监听:
- 拦截原生方法:覆盖 pushState 和 replaceState,手动触发事件。
- 监听 popstate 事件:浏览器前进/后退操作会触发该事件,但直接调用 pushState 不会。
// 覆盖 history.pushState 和 history.replaceState
const originalPushState = history.pushState;
history.pushState = function(state, title, url) {
originalPushState.apply(history, arguments);
// 手动触发自定义事件
window.dispatchEvent(new Event('pushstate'));
};
// 监听自定义事件和 popstate
window.addEventListener('pushstate', handleRouteChange);
window.addEventListener('popstate', handleRouteChange);
function handleRouteChange() {
const path = window.location.pathname; // 获取当前路径
console.log('Route changed to:', path);
}
// 示例:使用 pushState 修改路由
history.pushState({}, '', '/new-path');
二、Vue 框架中的路由监听
在 Vue 项目中,通常使用 vue-router 库管理路由,它会自动封装原生路由监听逻辑,开发者无需手动处理。vue-router 提供了两种模式:
- Hash 模式:基于 URL 哈希(如 http://example.com/#/home)。
- History 模式:基于 History API(需要服务器支持)。
1. Vue 中监听路由变化的方式
- 通过 watch 监听 $route:
export default {
watch: {
'$route'(to, from) {
console.log('路由变化:', to.path);
}
}
};
- 使用导航守卫
router.beforeEach((to, from, next) => {
console.log('即将进入路由:', to.path);
next();
});
2. Vue 是否需要原生路由监听?
- 不需要:vue-router 内部已经通过 hashchange 和 popstate 等原生事件监听路由变化,开发者只需使用其提供的 API(如 $route、导航守卫)。
- 特殊场景:如果需要在 Vue 之外监听路由(如微前端架构),可以结合原生方法,但要避免与 vue-router 冲突。
总结
场景 | 原生 JavaScript | Vue (vue-router) |
哈希路由变化 | hashchange 事件 | 使用 watch: { $route } 或导航守卫 |
History 路由变化 | 覆盖 pushState + 监听 popstate 事件 | 自动处理,无需额外代码 |
适用场景 | 纯原生项目、无框架环境 | 基于 Vue 的单页应用(SPA) |
建议在 Vue 中直接使用 vue-router 的 API,避免重复造轮子。
猜你喜欢
- 2025-05-02 前端分享-少年了解过iframe么(问一下少年)
- 2025-05-02 从零打造微前端框架:实战“汽车资讯平台”项目
- 2024-09-12 珠峰-前端架构师2023最新版
- 2024-09-12 太强了!牛客网曝光vite的微前端框架 -vite-micro,引发热潮
- 2024-09-12 基于大数据的前端应用架构设计与实现
- 2024-09-12 2023最新版-Web前端架构师(35周完结无密)
- 2024-09-12 基于 iframe 的微前端框架
- 2024-09-12 微前端项目部署方案
- 2024-09-12 1??微前端、乾坤、singleSpa
- 2024-09-12 前端高手特训 从0到1带你手写一个微信小程序底层框架-itzcw分享
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)