路由观察浏览器的URL的变更。当URL 变更时,路由会解析它并生成一个新的路由实例。

一个基本的路由是这样的:

class Router {
private _defaultController: string;
private _defaultAction: string; constructor(defaultController: string, defaultAction: string) {
this._defaultController = defaultController || "home";
this._defaultAction = defaultAction || "index";
} public initialize() {
$(window).on('hashchange', ()=> {
var r = this.getRoute();
this.onRouteChange(r);
})
} // 读取URL
private getRoute() {
var h = window.location.hash;
return this.parseRoute(h);
} // 解析URL
private parseRoute(hash: string) {
var comp, controller, action, args, i;
if(hash[hash.length - 1] === "/") {
hash = hash.substring(0, hash.length - 1);
}
comp = hash.replace("#", '').split('/');
controller = comp[0] || this._defaultController;
action = comp[1] || this._defaultAction; args = [];
for (i = 2; i < comp.length; i++) {
args.push(comp[i]);
}
return new Route(controller, action, args);
} private onRouteChange(route: Route) {
// 在此处执行控制器
}
}

上面这个类使用默认controller和默认方法的名字作为它的构造函数的参数。当没有参数被传入时,home和index作为默认controller名和默认方法名。

initialize方法被用来创建hashchange事件的监听。浏览器会在window.location.hash变更的时候触发这个事件。比如,当前页面的URL是http:localhost:8080,当用户点击了下面的链接<a href="#tasks/index">点我</a>,window.location.hash的值会变成“/task/index”。浏览器地址栏中的地址会变更,但hash字符会阻止浏览器重载当前页面。随后路由会使用parseRoute调用getRoute方法将URL转变成一个新的Route类实例。

URL遵循下面的命名规范:

#controllerName/actionName/arg1/arg2/arg3/argN

这意味着task/index URL 会被转换成:

new Route(“task”, “index”, []);

Route类的实例被传入onRouteChange()方法中,它将负责调用处理这个路由的controller

浅看spa单页应用路由的更多相关文章

  1. 前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS)

    前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS) 一.百度统计的代码: UV PV 统计方式可能存在问题 在 SPA 的前端项目中 数据统计,往往就是一个比较麻烦的事情,Re ...

  2. [vue]spa单页开发及vue-router基础

    - 了解spa页面跳转方式:(2种) spa: 单页跳转方式 开发(hash模式): https://www.baidu.com/#2313213 生产(h5利于seo): history.pushS ...

  3. Javascript 与 SPA单页Web富应用

    书单推荐 # <单页Web应用:JavaScript从前端到后端> http://download.csdn.net/detail/epubitbook/8720475 # <MVC ...

  4. 【读书笔记】WebApi 和 SPA(单页应用)--knockout的使用

    Web API从MVC4开始出现,可以服务于Asp.Net下的任何web应用,本文将介绍Web api在单页应用中的使用.什么是单页应用?Single-Page Application最常用的定义:一 ...

  5. js单页hash路由原理与应用实战

    什么是路由? 通俗点说,就是不同的URL显示不同的内容 什么是单页应用? 单页,英文缩写为SPA( Single Page Application),就是把各种功能坐在一个页面内. 那所谓的单页路由应 ...

  6. 大熊君学习html5系列之------History API(SPA单页应用的必备)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻……,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...

  7. 基于VUE的SPA单页应用开发-加载性能篇

    1.基于异步数据的vue页面刷新 先看看基于异步数据的vue页面刷新后,都发生了啥- 如图所示: 图1 基于异步数据的vue页面刷新 网络请求图 步骤如下: step1:请求页面: step2:请求页 ...

  8. 单页vue路由router

    Vue.js + vue-router 可以很简单的实现单页应用. <router-link> 是一个组件,该组件用于设置一个导航链接,切换不同 HTML 内容. to 属性为目标地址, ...

  9. 前端学习之路之SPA(单页应用)设计原理

    SPA设计 1.设计意义 前后端分离 减轻服务器压力 增强用户体验 Prerender预渲染优化SEO 前后端分离:前端做业务逻辑,后端处理数据和接口,耦合度减少,开发效率提高. 减轻服务器压力:一个 ...

随机推荐

  1. CDN相关知识及CDN绕过

    #什么是CDN? 内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.CDN应用广泛,支持多种行业 ...

  2. 【译】.NET 对象分配工具

    随着 Visual Studio 16.10 的发布,性能分析器又有了一个新的分析引擎,.NET 对象分配工具是第一个加入的工具.这为该工具提供了一些新特性,并显著提高了 perf 性能.在你的 C# ...

  3. 【LeetCode】930. 和相同的二元子数组

    930. 和相同的二元子数组 知识点:数组:前缀和: 题目描述 给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组. 子数组 是数组的一段连续 ...

  4. Pytest单元测试框架之FixTure内置临时文件tmpdir操作

    1.前言:某些接口需要引用上个接口返回的值,作为下个接口的入参,但笔者又不想在本地维护及创建此文件,此时引出fixture内置函数中的临时文件存储tmpdir 2.首先下面的源码是使用flask框架写 ...

  5. groff编写man页

    groff 是大多数 Unix 系统上所提供的流行的文本格式化工具 nroff/troff 的 GNU 版本.它一般用于编写手册页,即命令.编程接口等的在线文档.在本文中,我们将给你展示如何使用 gr ...

  6. Kafka之--python-kafka测试kafka集群的生产者与消费者

    前面两篇博客已经完成了Kafka的搭建,今天再来点稍高难度的帖子. 测试一下kafka的消息消费行为.虽然,kafka有测试的shell脚本可以直接测试,但既然我最近在玩python,那还是用pyth ...

  7. 简单快速安装Apache+PHP+MySql服务环境(四)—— 将php版本升级到7.2

    书接上文,简单快速安装Apache+PHP+MySql服务环境(二)-- centos使用yum安装指定版本的php. 随着各种PHP框架的升级,对PHP的版本也有了更高的要求,所以笔者也尝试着更新升 ...

  8. SpringBoot之了解自动配置原理

    承接上文: import注解的使用: 作用:引用时,容器自动创建出这填写的类型的组件,默认组件的名字就是全类名. 往容器中添加两个组件 @Import({User.class, DBHelper.cl ...

  9. 最长公共子序列问题(LCS)——Python实现

      # 最长公共子序列问题 # 作用:求两个序列的最长公共子序列 # 输入:两个字符串数组:A和B # 输出:最长公共子序列的长度和序列 def LCS(A,B): print('输入字符串数组A', ...

  10. js 倒计时退出

    <p>您已提交成功!<span id='submit_second'></span></p> $("#submit_second") ...