当前位置:首页 > 技术分析 > 正文内容

前端面试题-原生 js 如何进行监听路由的变化?vue框架是否用到?

ruisui882个月前 (05-04)技术分析21

在原生 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 提供了两种模式:

  1. Hash 模式:基于 URL 哈希(如 http://example.com/#/home)。
  2. 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,避免重复造轮子。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3792.html

分享给朋友:

“前端面试题-原生 js 如何进行监听路由的变化?vue框架是否用到?” 的相关文章

79.idea中git合并分支操作分享

文章目录前言1.fetch的操作2.合并最新代码到当前的开发分支3.解决冲突4.分支合并:5.完成代码合并总结前言git的操作在日产的工作中也非常重要,团队化的代码管理,每次如果代码被别人覆盖或者自己的代码不能提交到服务器那是灾难性的结果,本篇进行一篇分享来总结下idea中git的操作帮助java开...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

深入理解vue-router原理

说到vue-router就表明他只适合于vue和vue是强绑定的关系;不适合其他框架;现在我们模仿实现一个VueRouter;1.要使页面刷新;借助vue本身的响应式原理;import Home from "./views/Home"; import About from "...

VUE3+JAVA商城源码小程序APP商城

三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。软件架构后端: springboot2.3.12管...

gin-vue-admin 基于vue和gin 搭建的后台管理系统脚手架

项目地址:https://github.com/piexlmax/gin-vue-admingin-vue-admin gin+vue开源快速项目模板更新代码后如果遇到前端报错请执行 npm i 前端开发会不定期增加新的依赖 请注意更新重构记录2019年12月12日 17:15...