当前位置:首页 > VUE

不用vue实现切换路由

2026-01-20 03:24:44VUE

使用原生 JavaScript 实现路由切换

通过监听 URL 变化并动态加载内容,可以实现简单的路由切换功能。以下是一个基于 history.pushStatepopstate 事件的实现方式:

// 定义路由配置
const routes = {
  '/': '<h1>Home Page</h1>',
  '/about': '<h1>About Page</h1>',
  '/contact': '<h1>Contact Page</h1>'
};

// 获取内容容器
const contentDiv = document.getElementById('content');

// 初始化路由
function navigateTo(path) {
  window.history.pushState({}, path, window.location.origin + path);
  renderContent(path);
}

// 渲染内容
function renderContent(path) {
  contentDiv.innerHTML = routes[path] || '<h1>404 Not Found</h1>';
}

// 监听浏览器前进/后退
window.addEventListener('popstate', () => {
  renderContent(window.location.pathname);
});

// 初始加载
renderContent(window.location.pathname);

使用 Hash 模式实现路由

对于不支持 HTML5 History API 的旧浏览器,可以使用 hash 路由模式:

const routes = {
  '#/': '<h1>Home Page</h1>',
  '#/about': '<h1>About Page</h1>',
  '#/contact': '<h1>Contact Page</h1>'
};

function handleHashChange() {
  const hash = window.location.hash || '#/';
  document.getElementById('content').innerHTML = routes[hash] || '<h1>404 Not Found</h1>';
}

// 初始加载和监听变化
window.addEventListener('load', handleHashChange);
window.addEventListener('hashchange', handleHashChange);

使用动态内容加载

如果需要从服务器加载内容,可以修改渲染函数:

async function renderContent(path) {
  try {
    const response = await fetch(`/api/content${path}`);
    const html = await response.text();
    contentDiv.innerHTML = html;
  } catch (error) {
    contentDiv.innerHTML = '<h1>Error loading content</h1>';
  }
}

添加路由守卫功能

实现类似 Vue Router 的导航守卫:

const beforeHooks = [];

function beforeEach(callback) {
  beforeHooks.push(callback);
}

async function navigateTo(path) {
  let allowNavigation = true;

  for (const hook of beforeHooks) {
    const result = await hook(path);
    if (result === false) {
      allowNavigation = false;
      break;
    }
  }

  if (allowNavigation) {
    window.history.pushState({}, path, window.location.origin + path);
    renderContent(path);
  }
}

完整的路由类实现

封装一个更完整的路由解决方案:

class SimpleRouter {
  constructor() {
    this.routes = {};
    this.beforeHooks = [];
    this.contentElement = document.getElementById('content');

    window.addEventListener('popstate', () => this.render());
    window.addEventListener('load', () => this.render());
  }

  addRoute(path, content) {
    this.routes[path] = content;
  }

  beforeEach(callback) {
    this.beforeHooks.push(callback);
  }

  async navigate(path) {
    let allowNavigation = true;

    for (const hook of this.beforeHooks) {
      const result = await hook(path);
      if (result === false) allowNavigation = false;
    }

    if (allowNavigation) {
      window.history.pushState({}, path, window.location.origin + path);
      this.render();
    }
  }

  render() {
    const path = window.location.pathname;
    this.contentElement.innerHTML = this.routes[path] || '<h1>404 Not Found</h1>';
  }
}

// 使用示例
const router = new SimpleRouter();
router.addRoute('/', '<h1>Home Page</h1>');
router.addRoute('/about', '<h1>About Page</h1>');

这些方法提供了从简单到相对完整的路由实现方案,可以根据项目需求选择适合的方式或进行组合扩展。

不用vue实现切换路由

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

相关文章

vue实现tab切换

vue实现tab切换

Vue实现Tab切换的方法 使用v-if和v-show指令 通过v-if或v-show控制不同tab内容的显示与隐藏。v-if会销毁和重建DOM,适合切换频率低的场景;v-show仅切换CSS的dis…

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

vue为啥能实现监听

vue为啥能实现监听

Vue 实现监听的原理 Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。 核心机制:Object.defineProp…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现…

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue中如何实现循环

vue中如何实现循环

在 Vue 中实现循环 Vue 提供了 v-for 指令用于实现循环渲染列表数据。v-for 可以遍历数组、对象或数字范围,生成动态的 DOM 元素。 遍历数组 使用 v-for 遍历数组时,语法…