当前位置:首页 > VUE

js原生实现vue路由

2026-01-22 11:05:33VUE

使用 History API 实现路由切换

通过 window.history.pushStatepopstate 事件可以实现前端路由的无刷新跳转。创建一个路由对象管理路径与组件的映射关系。

class SimpleRouter {
  constructor(routes) {
    this.routes = routes;
    this.currentComponent = null;
    window.addEventListener('popstate', () => this.handleRouteChange());
  }

  handleRouteChange() {
    const path = window.location.pathname;
    const route = this.routes.find(r => r.path === path);
    if (route) {
      this.currentComponent = route.component;
      this.render();
    }
  }

  navigate(path) {
    window.history.pushState({}, '', path);
    this.handleRouteChange();
  }

  render() {
    const app = document.getElementById('app');
    app.innerHTML = '';
    app.appendChild(this.currentComponent());
  }
}

配置路由与组件映射

定义路由配置数组,每个路由对象包含路径和对应的组件渲染函数。

js原生实现vue路由

const routes = [
  {
    path: '/',
    component: () => {
      const div = document.createElement('div');
      div.textContent = 'Home Page';
      return div;
    }
  },
  {
    path: '/about',
    component: () => {
      const div = document.createElement('div');
      div.textContent = 'About Page';
      return div;
    }
  }
];

const router = new SimpleRouter(routes);
router.handleRouteChange(); // 初始化路由

实现导航链接

创建自定义的 <a> 标签,阻止默认跳转行为并使用路由的 navigate 方法。

js原生实现vue路由

document.querySelectorAll('a[data-router]').forEach(link => {
  link.addEventListener('click', (e) => {
    e.preventDefault();
    router.navigate(e.target.getAttribute('href'));
  });
});

处理动态路由参数

通过正则表达式匹配动态路径,并提取参数传递给组件。

// 修改路由配置
{
  path: '/user/:id',
  component: (params) => {
    const div = document.createElement('div');
    div.textContent = `User ID: ${params.id}`;
    return div;
  }
}

// 修改路由类的handleRouteChange方法
handleRouteChange() {
  const path = window.location.pathname;
  const route = this.routes.find(r => {
    const regex = new RegExp(`^${r.path.replace(/:\w+/g, '(\\w+)')}$`);
    return regex.test(path);
  });

  if (route) {
    const params = this.extractParams(route.path, path);
    this.currentComponent = () => route.component(params);
    this.render();
  }
}

extractParams(routePath, actualPath) {
  const params = {};
  const routeParts = routePath.split('/');
  const actualParts = actualPath.split('/');

  routeParts.forEach((part, i) => {
    if (part.startsWith(':')) {
      params[part.slice(1)] = actualParts[i];
    }
  });

  return params;
}

添加路由守卫功能

通过中间件机制实现路由跳转前的权限校验。

class SimpleRouter {
  constructor(routes, guards = []) {
    this.guards = guards;
    // ...其他初始化代码
  }

  async navigate(path) {
    let allowNavigation = true;
    for (const guard of this.guards) {
      if (!await guard(path)) {
        allowNavigation = false;
        break;
      }
    }

    if (allowNavigation) {
      window.history.pushState({}, '', path);
      this.handleRouteChange();
    }
  }
}

// 使用示例
const authGuard = async (path) => {
  if (path === '/admin' && !isLoggedIn()) {
    return false;
  }
  return true;
};

const router = new SimpleRouter(routes, [authGuard]);

标签: 路由js
分享给朋友:

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…