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

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

ruisui8817小时前技术分析1

在原生 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框架是否用到?” 的相关文章

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

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

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

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

「干货」Vue+Element前端导入导出Excel

作者:xrkffgg转发链接:https://segmentfault.com/a/11900000189936191 前言1.1 业务场景由前台导入Excel表格,获取批量数据。根据一个数组导出Excel表格。2 实现原理2.1 引入工具库file-saver、xlsx、script-loader...

vue父组件修改子组件的值(通过调用子组件的方法)

props只支持第一次加载这个组件的时候获取父组件的值,后续修改父组件的值得时候子组件并不会动态的更改。然而我们想要通过父组件修改子组件的值要怎么做呢?可以通过ref的方式调用子组件的方法改变子组件的值。子组件<template><div><span>{{data...

嵌入式实操——基于RT1170 使能SEMC配置SDRAM功能(八)

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发MCUXpresso SDK SEMC API 接口链接  在MCUXpresso SDK 框架下提供了对SEMC DDR进行操作的接口。学习链接:https://community.nxp.com/...