当前位置:首页 > VUE

不用vue实现spa

2026-01-08 05:58:24VUE

使用原生 JavaScript 实现 SPA

通过监听 URL 变化动态加载内容,结合 history.pushStatehashchange 事件实现路由切换。

// 路由配置
const routes = {
  '/': 'Home Page Content',
  '/about': 'About Page Content',
  '/contact': 'Contact Page Content'
};

// 渲染函数
function render(path) {
  document.getElementById('app').innerHTML = routes[path] || '404 Not Found';
}

// 监听路由变化
window.addEventListener('popstate', () => {
  render(window.location.pathname);
});

// 初始化路由
document.addEventListener('DOMContentLoaded', () => {
  document.body.addEventListener('click', (e) => {
    if (e.target.matches('[data-link]')) {
      e.preventDefault();
      history.pushState(null, null, e.target.href);
      render(window.location.pathname);
    }
  });
  render(window.location.pathname);
});

使用 Hash 路由方案

通过 window.location.hash 的变化实现路由切换,兼容性更好。

// 路由配置
const routes = {
  '#/': 'Home Page Content',
  '#/about': 'About Page Content',
  '#/contact': 'Contact Page Content'
};

// 渲染函数
function render(hash) {
  document.getElementById('app').innerHTML = routes[hash] || '404 Not Found';
}

// 监听 hash 变化
window.addEventListener('hashchange', () => {
  render(window.location.hash);
});

// 初始化
document.addEventListener('DOMContentLoaded', () => {
  if (!window.location.hash) {
    window.location.hash = '#/';
  }
  render(window.location.hash);
});

使用 Page.js 轻量级路由库

引入 Page.js 库简化路由实现,提供更丰富的路由功能。

<script src="https://unpkg.com/page/page.js"></script>
<script>
  page('/', () => {
    document.getElementById('app').innerHTML = 'Home Page';
  });
  page('/about', () => {
    document.getElementById('app').innerHTML = 'About Page';
  });
  page('*', () => {
    document.getElementById('app').innerHTML = '404 Not Found';
  });
  page();
</script>

结合 AJAX 加载动态内容

通过 XMLHttpRequest 或 Fetch API 从服务器加载内容片段。

不用vue实现spa

function loadContent(url) {
  fetch(url)
    .then(response => response.text())
    .then(html => {
      document.getElementById('app').innerHTML = html;
    });
}

window.addEventListener('popstate', () => {
  loadContent(window.location.pathname + '.html');
});

实现组件化架构

通过自定义元素或模板引擎实现组件化开发。

// 定义组件
class MyComponent extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `<div>Component Content</div>`;
  }
}

// 注册组件
customElements.define('my-component', MyComponent);

// 使用组件
document.getElementById('app').innerHTML = '<my-component></my-component>';

状态管理方案

通过全局对象或事件总线实现简单的状态管理。

不用vue实现spa

const store = {
  state: { count: 0 },
  setState(newState) {
    this.state = { ...this.state, ...newState };
    this.notify();
  },
  subscribers: [],
  subscribe(callback) {
    this.subscribers.push(callback);
  },
  notify() {
    this.subscribers.forEach(callback => callback(this.state));
  }
};

// 组件订阅状态变化
store.subscribe(state => {
  document.getElementById('counter').textContent = state.count;
});

性能优化技巧

使用惰性加载和缓存策略提升应用性能。

const componentCache = {};

async function loadComponent(name) {
  if (!componentCache[name]) {
    const response = await fetch(`/components/${name}.html`);
    componentCache[name] = await response.text();
  }
  return componentCache[name];
}

实现路由守卫

通过中间件函数实现路由权限控制。

function authGuard(ctx, next) {
  if (!isLoggedIn() && ctx.path !== '/login') {
    page.redirect('/login');
  } else {
    next();
  }
}

page('/dashboard', authGuard, () => {
  // 受保护的路由
});

服务端渲染支持

通过 Express 等服务器框架实现同构渲染。

const express = require('express');
const app = express();

app.get('*', (req, res) => {
  const html = `
    <html>
      <body>
        <div id="app">${getContentForPath(req.path)}</div>
        <script src="/client.js"></script>
      </body>
    </html>
  `;
  res.send(html);
});

标签: vuespa
分享给朋友:

相关文章

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue实现横向导航

vue实现横向导航

vue实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue中如何实现循环

vue中如何实现循环

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

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组…

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model 指…