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

在原生 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,避免重复造轮子。

原文链接:,转发请注明来源!