当前位置:首页 > JavaScript

js路由实现

2026-04-06 20:49:32JavaScript

路由的基本概念

路由在JavaScript中通常指根据URL的变化动态加载不同内容或页面,而无需刷新整个页面。前端路由常见于单页应用(SPA),通过监听URL变化匹配对应组件或逻辑。

基于Hash的路由实现

Hash路由利用URL中#后的部分(即hash)实现路由切换,不会触发页面刷新。

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

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

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

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

基于History API的路由实现

History路由利用HTML5的history.pushStatepopstate事件,可实现更干净的URL(无#)。

js路由实现

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

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

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

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

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

动态路由匹配

支持参数化路由,如/user/:id

class DynamicRouter {
  constructor() {
    this.routes = [];
    window.addEventListener('popstate', this.load.bind(this));
  }

  addRoute(path, callback) {
    const paramsKeys = [];
    const regex = path.replace(/:(\w+)/g, (_, key) => {
      paramsKeys.push(key);
      return '([^/]+)';
    });
    this.routes.push({
      regex: new RegExp(`^${regex}$`),
      callback,
      paramsKeys
    });
  }

  load() {
    const path = window.location.pathname;
    for (const route of this.routes) {
      const match = path.match(route.regex);
      if (match) {
        const params = {};
        route.paramsKeys.forEach((key, i) => {
          params[key] = match[i + 1];
        });
        route.callback(params);
        break;
      }
    }
  }
}

// 使用示例
const router = new DynamicRouter();
router.addRoute('/user/:id', (params) => {
  console.log(`User ID: ${params.id}`);
});

路由库的使用

实际项目中通常使用成熟的路由库,如React Router或Vue Router。

js路由实现

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');

路由守卫实现

控制路由跳转前后的权限校验或逻辑处理。

class GuardedRouter extends HistoryRouter {
  constructor() {
    super();
    this.beforeHooks = [];
    this.afterHooks = [];
  }

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

  afterEach(callback) {
    this.afterHooks.push(callback);
  }

  navigate(path) {
    const runHooks = (hooks, args, index = 0) => {
      if (index >= hooks.length) return Promise.resolve();
      return hooks[index](...args).then(() => runHooks(hooks, args, index + 1));
    };

    runHooks(this.beforeHooks, [path])
      .then(() => {
        history.pushState({}, '', path);
        this.load();
        runHooks(this.afterHooks, [path]);
      });
  }
}

// 使用示例
const router = new GuardedRouter();
router.beforeEach((path) => {
  console.log(`Navigating to ${path}`);
  return Promise.resolve();
});

以上实现方案覆盖了从基础路由到高级功能的完整链路,可根据实际需求选择适合的方案或组合使用。

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

相关文章

Vue实现路由监

Vue实现路由监

Vue实现路由监听的方法 在Vue中,可以通过多种方式监听路由变化,以下是常见的实现方法: 使用Vue Router的全局前置守卫 router.beforeEach((to, from, nex…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

vue路由实现滑动

vue路由实现滑动

路由切换滑动动画实现 在Vue中实现路由切换时的滑动动画,可以通过Vue的过渡系统结合CSS动画或第三方库完成。以下是几种常见方法: 使用Vue过渡 + CSS动画 包裹<router-vie…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…