当前位置:首页 > JavaScript

js 实现路由

2026-04-06 23:50:54JavaScript

实现路由的基本概念

路由在前端开发中用于管理不同URL路径对应的页面或组件渲染。常见的实现方式包括原生JavaScript、第三方库(如React Router、Vue Router)或基于History API的自定义方案。

原生JavaScript实现路由

通过监听URL变化并动态加载内容,以下是基于hashHistory API的两种实现方式:

js 实现路由

基于Hash的路由

Hash路由依赖URL中的#部分,变化时触发hashchange事件,兼容性较好。

js 实现路由

class HashRouter {
  constructor() {
    this.routes = {};
    window.addEventListener('hashchange', this.handleHashChange.bind(this));
  }

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

  handleHashChange() {
    const hash = window.location.hash.slice(1) || '/';
    if (this.routes[hash]) {
      this.routes[hash]();
    }
  }
}

// 使用示例
const router = new HashRouter();
router.addRoute('/', () => console.log('Home Page'));
router.addRoute('/about', () => console.log('About Page'));

基于History API的路由

History API通过pushStatepopstate实现无刷新URL变更,需服务器配合避免404。

class HistoryRouter {
  constructor() {
    this.routes = {};
    window.addEventListener('popstate', this.handlePopState.bind(this));
  }

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

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

  handlePopState() {
    const path = window.location.pathname;
    if (this.routes[path]) {
      this.routes[path]();
    }
  }
}

// 使用示例
const router = new HistoryRouter();
router.addRoute('/', () => console.log('Home Page'));
router.addRoute('/about', () => console.log('About Page'));
router.navigate('/about'); // 手动触发导航

使用第三方库

若项目基于框架(如React/Vue),可直接使用成熟的路由库:

React Router示例

import { BrowserRouter, Route, Link } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
    </BrowserRouter>
  );
}

Vue Router示例

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

const router = new VueRouter({
  routes,
});

new Vue({
  router,
}).$mount('#app');

关键注意事项

  1. Hash路由:兼容性好但URL不美观,适合静态站点。
  2. History路由:需服务器配置重定向(如Nginx的try_files),否则刷新会404。
  3. 动态路由:可通过参数匹配(如/user/:id),需在回调中解析参数。
  4. 懒加载:结合动态导入(如import())优化性能。

通过以上方法,可根据项目需求选择合适的路由实现方案。

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

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现投球

js实现投球

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

vue路由实现登录

vue路由实现登录

路由守卫实现登录验证 在Vue项目中,可以通过路由守卫(Navigation Guards)来实现登录验证逻辑。路由守卫能在路由跳转前、跳转后或跳转时进行拦截处理。 安装路由依赖 npm inst…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…