路由观察浏览器的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. ES6新增语法(二)——函数和参数

    箭头函数 箭头函数:将原来函数的function关键字和函数名都删掉,并使用"=>"连接参数列表和函数体. 箭头函数语法: (参数1,参数2)=>{ 函数体 } 注意点 ...

  2. 团队开发day07

    开始整合项目,测试登录,注册,搜索功能, 在安卓中数据处理存在个别错误,功能逻辑有个别不正确 进行修改和完善,添加二次确认退出

  3. NDT匹配: The Normal Distributions Transform: A New Approach to Laser Scan

    介绍 大多数激光匹配算法都是基于点或者线的特征匹配,该论文提出一种2D激光扫描匹配算法,方法类似于占据栅格,将2D平面分为一个个cell,对于每个cell,设定其一个正态分布,表示该网格测量到每个点的 ...

  4. Mycat读写分离的简单实现

    目录 1.Mycat读写分离的配置 1.1.Mycat是什么 1.2.Mycat能干什么 1.2.1.数据库的读写分离 1.2.1.1.数据库读写分离图解 1.2.2.数据库分库分表 1.2.2.1. ...

  5. MyEclipse无法打开jsp文件(打开是空白的),但是可以打开java文件

    转载: 解决MyEclipse使用时打开JSP发生"An error has occurred,See error log for more details"错误的解决方法这个问题 ...

  6. CentOS 7安装Python3 笔记

    当前系统为阿里云的CentOS7.3 64位操作系统. 为了能让后续安装的软件(django,uwsgi,nginx等)尽量减少出现bug的几率,先把可能的依赖包都安装上. 一.安装依赖包 yum - ...

  7. MYSQL时间戳和日期相互转换 笔记整理

    相关函数: date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, fo ...

  8. Web 字体 font-family 浅谈

    前言 最近研究各大网站的font-family字体设置,发现每个网站的默认值都不相同,甚至一些大网站也犯了很明显的错误,说明字体还是有很大学问的,值的我们好好研究. 不同的操作系统.不同浏览器下内嵌的 ...

  9. 第三篇 -- HTML基础

    买的课程学习 Web 前端标准 web前端技术指的不是某一项技术,而是一系列技术的集合,主要包括: html -- 结构标准:负责网页结构的搭建 css -- 样式标准/表现标准:负责网页的美化工作 ...

  10. mysql为什么用b+树做索引

    关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...