前端框架通识:路由原理

js实现轻量级前端路由框架 其用少量的代码,实现了web项目的单页面实现框架,通过此框架可以实现前端路由功能。此框架适合做单页面程序。简单、实用、可拓展 立即下载

前端路由是现代单页面(SPA)应用必备的功能,每个现代前端框架都有对应的实现,例如vue-router、react-router。

我们不想探究vue-router或者react-router们的实现,因为不管是哪种路由无外乎用兼容性更好的hash实现或者是H5 History实现,与框架几个只需要做相应的封装即可。

前端路由实现起来其实很简单,本质就是监听 URL 的变化,然后匹配路由规则,显示相应的页面,并且无须刷新。目前单(SPA)页面使用的路由就只有两种实现方式:

  1. hash模式
  2. history模式

hash模式

hash路由一个明显的标志是带有#,当后面的哈希值发生变化时,不会向服务器请求数据,可以通过hashchange事件来监听到URL的变化,从而进行跳转页面。

http://www.test.com/#/home

 流程图:

 案例:

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>hash router</title>
</head>
<body>
  <ul>
      <li><a href="#/">turn yellow</a></li>
      <li><a href="#/blue">turn blue</a></li>
      <li><a href="#/green">turn green</a></li>
  </ul>
  <button>back</button>
  <script src="./hash.js" charset="utf-8"></script>
</body>
</html>

hash.js

class Routers {
  constructor() {
    // 储存hash与callback键值对
    this.routes = {};
    // 当前hash
    this.currentUrl = '';
    // 记录出现过的hash
    this.history = [];
    // 作为指针,默认指向this.history的末尾,根据后退前进指向history中不同的hash
    this.currentIndex = this.history.length - 1;
    this.refresh = this.refresh.bind(this);
    this.backOff = this.backOff.bind(this);
    // 默认不是后退操作
    this.isBack = false;
    window.addEventListener('load', this.refresh, false);
    window.addEventListener('hashchange', this.refresh, false);
  }

  route(path, callback) {
    this.routes[path] = callback || function() {};
  }

  refresh() {
    this.currentUrl = location.hash.slice(1) || '/';
    if (!this.isBack) {
      // 如果不是后退操作,且当前指针小于数组总长度,直接截取指针之前的部分储存下来
      // 此操作来避免当点击后退按钮之后,再进行正常跳转,指针会停留在原地,而数组添加新hash路由
      // 避免再次造成指针的不匹配,我们直接截取指针之前的数组
      // 此操作同时与浏览器自带后退功能的行为保持一致
      if (this.currentIndex < this.history.length - 1)
        this.history = this.history.slice(0, this.currentIndex + 1);
      this.history.push(this.currentUrl);
      this.currentIndex++;
    }
    this.routes[this.currentUrl]();
    console.log('指针:', this.currentIndex, 'history:', this.history);
    this.isBack = false;
  }
  // 后退功能
  backOff() {
    // 后退操作设置为true
    this.isBack = true;
    this.currentIndex <= 0
      ? (this.currentIndex = 0)
      : (this.currentIndex = this.currentIndex - 1);
    location.hash = `#${this.history[this.currentIndex]}`;
    this.routes[this.history[this.currentIndex]]();
  }
}

window.Router = new Routers();
const content = document.querySelector('body');
const button = document.querySelector('button');
function changeBgColor(color) {
  content.style.backgroundColor = color;
}

Router.route('/', function() {
  changeBgColor('yellow');
});
Router.route('/blue', function() {
  changeBgColor('blue');
});
Router.route('/green', function() {
  changeBgColor('green');
});

button.addEventListener('click', Router.backOff, false);

案例运行地址

history模式

History 模式是 HTML5 新推出的功能,比之 Hash URL 更加美观。

我们可以直接在浏览器中查询出History API的方法和属性:

想了解更多api属性

看一下常用的api:

window.history.back();       // 后退
window.history.forward();    // 前进
window.history.go(-3);       // 后退三个页面

// 通过 History 模式改变 URL 同样不会引起页面的刷新,只会更新浏览器的历史记录
window.history.pushState(state, title, URL) // 新增历史记录
window.history.replaceState(state, title, URL) // 替换当前历史记录

state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。
title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。
url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

// 当用户做出浏览器动作时,比如点击后退按钮时会触发 popState 事件,或者使用 JavaScript 调用back、forward、go方法时才会触发。
window.addEventListener('popstate', e => {
  // e.state 就是 pushState(stateObject) 中的 stateObject
  console.log(e.state)
})

流程图:

 案例:

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>h5 router</title>
</head>
<body>
  <ul>
      <li><a href="/">turn yellow</a></li>
      <li><a href="/blue">turn blue</a></li>
      <li><a href="/green">turn green</a></li>
  </ul>
</body>
</html>
<script>
class Routers {
  constructor() {
    this.routes = {};
    this._bindPopState();
  }
  init(path) {
    history.replaceState({path: path}, null, path);
    this.routes[path] && this.routes[path]();
  }

  route(path, callback) {
    this.routes[path] = callback || function() {};
  }

  go(path) {
    history.pushState({path: path}, null, path);
    this.routes[path] && this.routes[path]();
  }
  _bindPopState() {
    window.addEventListener('popstate', e => {
      const path = e.state && e.state.path;
      this.routes[path] && this.routes[path]();
    });
  }
}

window.Router = new Routers();
Router.init(location.pathname);
const content = document.querySelector('body');
const ul = document.querySelector('ul');
function changeBgColor(color) {
  content.style.backgroundColor = color;
}

Router.route('/', function() {
  changeBgColor('yellow');
});
Router.route('/blue', function() {
  changeBgColor('blue');
});
Router.route('/green', function() {
  changeBgColor('green');
});

ul.addEventListener('click', e => {
  if (e.target.tagName === 'A') {
    e.preventDefault();
    Router.go(e.target.getAttribute('href'));
  }
});
</script>

案例运行地址

两种模式对比

  1. Hash 模式只可以更改 # 后面的内容,History 模式可以通过 API 设置任意的同源 URL
  2. History 模式可以通过 API 添加任意类型的数据到历史记录中,Hash 模式只能更改哈希值,也就是字符串
  3. Hash 模式无需后端配置,并且兼容性好。History 模式在用户手动输入地址或者刷新页面的时候会发起 URL 请求,后端需要配置 index.html 页面用于匹配不到静态资源的时候

参考:

https://juejin.im/post/5ac61da66fb9a028c71eae1b

https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc72e6e51d45054f664dbf

【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》 1]吴凯,沈文忠,贾丁丁,等.融合Transformer和CNN的手掌静脉识别网络[J].计算机工程与应用,2023,59(24):98-109. 阅读详情

相关推荐

PyGPT:桌面AI助手整合大模型与本地知识库,打造高效工作流

大语言模型(LLM)通过理解和生成自然语言,正深刻改变人机交互方式。其核心原理是基于海量数据训练的Transformer架构,能够根据上下文进行预测和生成。这一技术价值在于将强大的AI能力平民化,广泛应用于代码生成、文档分析、创意写作和智能问答等场景。通过API调用云端模型或本地部署开源模型,开发者可以构建个性化的AI应用。本文聚焦于PyGPT这一桌面AI助手,它巧妙地将ChatGPT、Claude、Gemini等主流大模型与LlamaIndex、Ollama等本地化工具整合,实现了聊天、文件分析、代码解释

weixin_28679635的博客 437

各种前端框架中的路由原理解析

html> html lang="en"> head> meta charset="UTF-8"> title>我的路由title> head> body> a href="#/home">HOMEa> a href="#/cart">CARTa> p>哈哈p> router-view>router-view> div> 嘻嘻 div> body> html>

ITzhongzi的博客 2076

qt下使用grpc编程(2) —— 练手!自己改的一个简单小例子!1

(1)在研究了grpc官方提供的helloworld例程后,自己试着写了个小程序。 (2)编写proto文件。 proto文件用于定义服务和消息,用protobuf的语法编写,protobuf是一种通信协议,详细请百度。下面附上源码: syntax = "proto3"; option java_multiple_files = true; option java_pac

u011099079的博客 3924

前端路由的实现原理(包括Angular、vue等框架)

这里写自定义目录标题浏览器路由的介绍hash路由HTML5 History API 浏览器路由的介绍 通常来说路由即是URL到函数的映射,比如我们在客户端输入一个URL,该URL会被提交到一个控制器,相应的控制器会对客户端提交上来的路由进行解析, 从而找到处理这个 URL 的类和函数,然后执行。最初web系统的路由都是由服务端来实现的,后来随着前端技术的发展,web系统的路由慢慢都交由前端来实现。...

Benjamin920813的博客 2995

从USB相机标定到Aruco码精准定位:基于aruco-ros的机器人视觉实践

本文详细介绍了基于aruco-ros的机器人视觉实践,从USB相机标定到Aruco码精准定位的全流程。通过实战案例和优化技巧,展示了Aruco码在机器人导航中的高精度位姿识别能力,帮助开发者快速实现毫米级视觉定位系统。

weixin_27310417的博客 487

Curve+ 5.0.2:新一代色彩校准工具如何革新印刷行业标准

Curve+ 5.0.2作为新一代色彩校准工具,通过G7+校准算法和SCTV技术革新了印刷行业的色彩管理标准。该工具显著提升色彩精准度,减少打样时间和材料浪费,支持专色处理,实现跨材质色彩一致性,为印刷企业带来效率与质量的全面提升。

weixin_29228781的博客 529

前端框架中的路由(Routing)和前端导航(Front-End Navigation)

前端框架中的路由(Routing)和前端导航(Front-End Navigation)

商务合作欢迎私信我 2642

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

前端面试问题答案汇总--通识篇

转载于https://github.com/poetries/FE-Interview-Questions,bypoetries 一、网络 #1 UDP 1.1 面向报文 UDP是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是UDP只是报文的搬运工,不会对报文进行任何拆分和拼接操作 具体来说 在发送端,应用层将数据传递给传输层的UDP协议,...

aikok0033的博客 446

如何利用Dpabi,AFNI,FSL软件计算种子点的功能连接?

fsl_glm 得到的是线性回归系数(beta coefficient),由于在自变量和因变量标准化(均值为 0,标准差为 1)的情况下,简单线性回归的回归系数和皮尔逊相关系数是相同的,因此这是一种间接的方法。(3)上一步得到的 PCC.nii.gz 文件是 Harvard-Oxford 概率模板中的后扣带回,每个体素中的数值(1-100)表示该体素属于 PCC 的概率,反映 PCC 在不同被试中的变异大小,也表示我们对于某个体素属于PCC 的信心。接下来,我们来聊聊功能连接在数据处理里的具体应用。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 7841

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 183

前端框架Vue----路由

目录路由定义 路由定义 一组key-value的集合,由路由器统一管理。 便于实现单页面应用SPA,局部刷新(ajax) 前端: 路由<----->组件 后端: 路由<------>视图函数

weixin_45228198的博客 601

中国工商银行企业架构建设实践最全总结

中国工商银行参考IBM持续价值创新方法并吸收TOGAF等主流企业架构的框架理念,结合业务实际情况形成工行自己的企业架构方法论并实践,为数字化转型提供支撑。本案例通过介绍中国工商银行企业架构之业务架构设计方法,为其他银行企业架构建设提供参考。 企业架构是数字化转型的抓手,可以帮助企业规划、管理和实施数字化解决方案,以实现业务目标并适应不断变化的市场条件。中国工商银行通过战略目标指导业务架构的规划和设计,业务架构建模后指导IT架构建模。

银行信息系统应用架构详解 2730

2024 高级前端面试题之 框架通识 「精选篇」

前端面试题之框架通识「精选篇」

XH_jing的博客 1403

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

前端面试锦集

基本面试: 做过最满意的项目是什么?项目背景?为什么要做这件事情?最终达到什么效果?你处于什么样的角色,起到了什么方面的作用?在项目中遇到什么技术问题?具体是如何解决的? 如果再做这个项目,你会在哪些方面进行改善? 基础扎实: IT行业,哪些发展好的同学都是具备扎实基础知识,如果理解计算机基础会更好,因为我们面临很多非前端计算问题的。 主动思考: 被动完成任务成长会很慢的,需要有自己的想法,而不是仅仅是完成任务的。 自动学习: 前端领域知识淘汰速度很快,需要经常学习新知识。 追溯深度: 遇到问题是多研究背.

Front小思的博客 6724

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vue-router 前端路由框架扫盲

    vue-router是一个与vue核心深度集成的前端路由框架。路由这个词对大家来说其实并不陌生,我们用传统的web项目来举个例子。如下图所示,这是一个左侧为菜单,右侧为功能页面的一个首页效果。此时的路由为:投诉举报/我的批次/批次管理/列表。如果我们要实现这样一个效果,会将红框的部分设置为一个&lt;iframe/&gt;标签,然后通过菜单的点击事件去切换iframe的链接,一般来说每一个...

dingshuangyong的博客 2968

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

5. 前端框架—Vue路由

文章目录前端框架—Vue路由router1. 场景模拟1.1.编写父组件1.2 编写登录及注册组件login.js内容register.js内容1.3 在父组件中引用1.4 存在的问题2. vue-router简介和安装3. vue-router快速入门3.1 在父组件中引入router对象3.2 页面跳转控制3.3 效果4. vue-router案例☆ 前端框架—Vue路由router 1. 场景模拟 一个页面,包含登录和注册,点击不同按钮,实现登录和注册页切换: 1.1.编写父组件 入口:ind

weixin_45267102的博客 472

从浏览器跳转到前端框架的路由实现

还记得jquery时代吗,那时前端三大框架还没流行,前端开发者疯狂查着jquery的API文档来进行dom操作,还记得这个地址吗 jquery.cuishifeng.cn/ 是不是很有感觉!(想了解前端历史的,请看我这篇文章前端技术发展 juejin.im/post/5cc6b5… 记得在学校里刚开始写网页的时候,只是对JavaScript学了个大概,然后就开始学jquery进行网页开发了。 如果...

微信-sjk6070 525

前端实现路由

前端实现路由 目的: 后端实现的路由本质是通过服务器代理与路径的配合去访问服务器上的静态资源。 而我们现在的项目都是单页面,路由控制权都是放在前端了。 前端框架现在都是单页面模式,了解他们实现的本质变得重中之重。 简单分析: 前端实现路由有两种方式 hash 与 history hash路由: hash原本是作为页面定位使用,本身会在URL后携带#,切换路由只改变#后面的值,他不会改变浏览器访问服务器资源的地址(#前的才会被用在请求中),所以改变hash值就像我们改变url参数一样不会导致页面的重载

qq_37162688的博客 555

前端路由

前端路由的实现方式 目前前端的路由实现主要是两种方式,这两种方式都是基于浏览器自身的特性,两种方式分别是 hash路由 history路由 hash路由 hash 这个概念,可能听起来有些陌生,不过,其实我们在之前的前端开发中,其实是有所接触的。hash路由一个明显的标志#,通过这个监听URL中的hash变化来进行路由的跳转 例如,在某些情况下,我们需要定位页面上的某些位置,就像下面的例子中展...

阳光下的冷静的博客 1219

简单讲讲前端路由概念

前端路由 路由历史 什么是路由? 路由是根据不同的 url 地址展示不同的内容或页面 早期的路由都是后端直接根据 url 来 reload 页面实现的,即后端控制路由。 后来页面越来越复杂,服务器压力越来越大,随着 ajax(异步刷新技术) 的出现,页面实现非 reload 就能刷新数据,让前端也可以控制 url 自行管理,前端路由由此而生。 单页面应用的实现,就是因为前端路由。

耐得住寂寞也是一种境界 8293

前端之路由篇

一. 路由的前世今生 前端开发的同学们,在日常工作中或多或少的会使用到页面的路由。尤其是今年来前端路由框架层出不群,React, Vue 等主流前端框架也都有各自标配。更多的是在单页面应用中,通过路由实现局部刷新,按需加载等都可以通过其关联来实现。那么路由的基本原理怎样?一个路由库是如何实现?解析来我们简要的分析并实践它。 二. 路由的基本原理 1. 常见路由分类 HASH 路由 hash 路由通常在url中会携带 # 字符, 其后部分对应为hash值。hash值的改变会触发onhashchange事件

绿足 博客 1114

前端路由实现

前端路由学习

越努力,越幸运! 8851

[Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制

一、前言   前端路由是什么?如果你之前从事的是后端的工作,或者虽然有接触前端,但是并没有使用到单页面应用的话,这个概念对你来说还是会很陌生的。那么,为什么会在单页面应用中存在这么一个概念,以及,前端路由与我们后端的路由有什么异同呢。本章,我们就来简单介绍下前端路由的概念,以及如何在 Vue 中使用 Vue Router 来实现我们的前端路由。   学习系列目录地址:https://www....

weixin_30852451的博客 311

reactrouter监听路由变化_深入理解前端中的 hash 和 history 路由

我们在使用 Vue 或者 React 等前端渲染时,通常会有 hash 路由和 history 路由两种路由方式。hash 路由:监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;history 路由:监听 url 中的路径变化,需要客户端和服务端共同的支持;我们一步步实现这两种路由,来深入理解下底层的实现原理。我们主要实现以下几个简单的功能:...

weixin_39618956的博客 2652

Vue项目布署后,刷新页面404的真正原因找到了

从一篇日记说起我是一个小前端,我有写日记的习惯2020年10月17天气 晴今天天气不错,心情也跟着好起来了辛辛苦苦加班两个星期终于完成了产品需求,到了要上线的时候了,嘴里也不知不觉哼起...

Crazymryan的博客 4633
上一篇: 前端框架通识:MVVM是什么?
下一篇: 前端框架通识:Virtual DOM(虚拟 DOM)
An_s
博客等级 码龄10年 665粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值