当前位置:首页 > VUE

js原生实现vue路由

2026-02-23 02:06:35VUE

原生 JavaScript 实现 Vue 路由的核心逻辑

通过监听 URL 变化并动态渲染对应组件,可以实现类似 Vue Router 的功能。以下是关键实现步骤:

路由配置与初始化

定义路由配置对象,包含路径与组件的映射关系:

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  { path: '/contact', component: Contact }
];

创建路由实例并初始化当前路由:

class Router {
  constructor(routes) {
    this.routes = routes;
    this.currentRoute = null;
    this.init();
  }
}

监听 URL 变化

通过 popstate 事件监听浏览器前进/后退操作:

window.addEventListener('popstate', () => {
  this.handleRouteChange();
});

手动触发路由变化时使用 pushState

js原生实现vue路由

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

路由匹配与渲染

根据当前路径匹配对应组件:

matchRoute(path) {
  return this.routes.find(route => route.path === path) || 
         this.routes.find(route => route.path === '*');
}

渲染匹配到的组件:

handleRouteChange() {
  const path = window.location.pathname;
  this.currentRoute = this.matchRoute(path);
  this.renderComponent();
}

renderComponent() {
  const app = document.getElementById('app');
  app.innerHTML = '';
  new this.currentRoute.component().mount(app);
}

组件基类实现

定义基础组件类支持挂载逻辑:

js原生实现vue路由

class BaseComponent {
  constructor() {
    this.state = {};
  }

  mount(container) {
    this.container = container;
    this.render();
  }

  render() {
    this.container.innerHTML = this.template();
  }

  template() {
    return '';
  }
}

示例组件实现:

class Home extends BaseComponent {
  template() {
    return `<h1>Home Page</h1>`;
  }
}

路由链接组件

创建 <router-link> 的自定义实现:

class RouterLink extends HTMLElement {
  connectedCallback() {
    this.addEventListener('click', e => {
      e.preventDefault();
      router.navigateTo(this.getAttribute('to'));
    });
  }
}
customElements.define('router-link', RouterLink);

完整使用示例

初始化路由并挂载到 DOM:

const router = new Router(routes);
document.addEventListener('DOMContentLoaded', () => {
  router.handleRouteChange();
});

HTML 中使用路由链接:

<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
<div id="app"></div>

注意事项

  1. 需要处理 404 情况,可通过添加通配符路由 { path: '*', component: NotFound }
  2. 考虑添加路由守卫逻辑,在 handleRouteChange 中加入验证钩子
  3. 复杂项目建议直接使用 Vue Router,此方案适用于学习原理或简单场景

这种实现省略了嵌套路由、懒加载等高级特性,但展示了前端路由的核心机制:URL 变化触发视图更新。

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

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…