Vue Router 监听地址变化的核心逻辑示意

Vue Router 监听地址变化的核心逻辑示意

搞个简化版本主要展示下 Vue Router最核心的监听和更新机制。

核心实现原理代码

javascript 复制代码
// 简化版 Vue Router 核心逻辑示例
class VueRouter {
  constructor(options) {
    this.routes = options.routes;
    this.current = window.location.hash.slice(1) || '/';
    
    // 监听 hashchange 事件(哈希模式)
    window.addEventListener('hashchange', () => {
      this.current = window.location.hash.slice(1);
      this.updateView();
    });
    
    // 或者监听 popstate 事件(历史模式)
    window.addEventListener('popstate', (event) => {
      if (event.state && event.state.route) {
        this.current = event.state.route;
        this.updateView();
      }
    });
    
    // 初始渲染
    this.updateView();
  }
  
  // 更新视图的核心方法
  updateView() {
    // 1. 根据当前路径匹配路由
    const matchedRoute = this.matchRoute(this.current);
    
    // 2. 获取对应的组件
    const component = matchedRoute.component;
    
    // 3. 渲染组件到 router-view
    const routerView = document.querySelector('router-view');
    if (routerView && component) {
      // 清除旧内容
      routerView.innerHTML = '';
      
      // 创建新组件实例并挂载
      const componentInstance = new component();
      routerView.appendChild(componentInstance.$el || componentInstance);
    }
  }
  
  // 路由匹配算法
  matchRoute(path) {
    return this.routes.find(route => route.path === path) || 
           this.routes.find(route => route.path === '*'); // 通配符
  }
  
  // 编程式导航
  push(path) {
    // 哈希模式
    window.location.hash = '#' + path;
    
    // 或历史模式
    // window.history.pushState({ route: path }, '', path);
    
    this.current = path;
    this.updateView();
  }
  
  // 替换当前路由
  replace(path) {
    // 哈希模式
    window.location.replace('#' + path);
    
    // 或历史模式
    // window.history.replaceState({ route: path }, '', path);
    
    this.current = path;
    this.updateView();
  }
}

// 使用示例
const router = new VueRouter({
  routes: [
    { path: '/', component: HomeComponent },
    { path: '/about', component: AboutComponent },
    { path: '/user/:id', component: UserComponent },
    { path: '*', component: NotFoundComponent }
  ]
});

监听机制流程图

用户 浏览器 Vue Router RouterView 组件 1. 初始加载 触发 hashchange/popstate 解析当前路径 /about 匹配路由配置 获取 AboutComponent 指令渲染 AboutComponent 挂载组件实例 2. 用户点击链接 点击 /user/123 URL 变化,触发 hashchange 执行路由守卫 beforeEach 解析新路径 /user/123 提取参数 {id: 123} 获取 UserComponent 销毁旧组件,渲染新组件 挂载 UserComponent(123) 执行 afterEach 钩子 用户 浏览器 Vue Router RouterView 组件

关键点

  1. 两种监听模式

    • 哈希模式 :监听 hashchange 事件
    • 历史模式 :监听 popstate 事件
  2. 核心流程

    • 地址变化 → 事件触发 → 解析路径 → 匹配路由 → 获取组件 → 更新视图
  3. 视图更新

    • 找到 <router-view> 容器
    • 销毁旧组件(清理资源)
    • 创建并挂载新组件
  4. 扩展功能

    • 路由守卫(beforeEach、afterEach)
    • 动态路由参数(/user/:id
    • 嵌套路由(多级 <router-view>
    • 懒加载(异步组件)

实际 Vue Router 的实现会更复杂,包括:

  • 响应式系统(currentRoute 是响应式的)
  • 组件生命周期管理
  • 滚动行为控制
  • 路由元信息等
相关推荐
lifewange20 小时前
UI自动化页面元素定位有几种方式
前端·ui·自动化
牛奶21 小时前
2026 春涧·前端走向全栈
前端·人工智能·全栈
Piper蛋窝21 小时前
AI 有你想不到,也它有做不到 | 2025 年深度使用 Cursor/Trae/CodeX 所得十条经验
前端·后端·代码规范
LYFlied21 小时前
WebAssembly为何能实现极致性能:从设计原理到执行优势
前端·wasm·跨端
韩立学长21 小时前
【开题答辩实录分享】以《在线作业标准流程指导系统的设计与实现》为例进行选题答辩实录分享
java·javascript
百万蹄蹄向前冲21 小时前
2026云服务器从零 搭建与运维 指南
服务器·javascript·后端
释怀不想释怀1 天前
vue布局,动态路由
前端·html
桜吹雪1 天前
Vue 基础:状态管理入门
前端·vue.js
JavaGuide1 天前
利用元旦假期,我开源了一个大模型智能面试平台+知识库!
前端·后端
yuanyxh1 天前
程序设计
前端·设计