前端路由原理

       本篇文章主要介绍前端路由相关的文章。在稍微复杂一点的SPA,都需要路由,vue-router也是vue全家桶的标配之一。vue-router中有hashH5 History两种路由模式,下面,我们逐个进行讲解。

一、网页中url组成部分

网页中url组成部分

二、hash模式

       1、hash变化会触发网页跳转,即浏览器的前进、后退。
       2、hash变化不会刷新页面,SPA必需的特点
       3、hash永远不会提交到server端(自生自灭)
       在浏览器端,我们可以通过调用window.onhashchange方法来监听页面hash的变化。下面的操作,都不会导致页面hash值发生改变,从而触发window.onhashchange方法的执行。

a. js修改url
b. 手动修改 url 的hash
c. 浏览器前进、后退

具体请看下面代码
1、监听hash改变

// hash 变化 包括
// a. js修改url
// b. 手动修改 url 的hash
// c. 浏览器前进、后退
window.onhashchange = (event) => {
    console.log('old url', event.oldURL)
    console.log('new url', event.newURL)
    console.log('hash',location.hash)
}

2、页面初次加载,获取hash

// 页面初次加载,获取hash
document.addEventListener('DOMContentLoaded', () => {
     console.log('hash:', location.hash)
})

3、js修改hash

document.getElementById('btn1').addEventListener('click', function(){
     location.href="#/user"
})

4、手动修改hash
       此处不做演示。

三、H5 history模式

       1、用url规范的路由,但是跳转时不刷新页面。
       2、history.pushState
       3、history.onpopstate
       正常页面浏览是需要刷新页面的,改造成H5 history模式后,在首次加载后,就不需要刷新页面了。如下所示:

正常页面浏览是需要刷新页面的

改造成H5 history模式后,在首次加载后,就不需要刷新页面了

       1、history.pushStatehistory.repalceState的使用
       pushState说明
       pushState方法接受三个参数,依次为:state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

       最常用的方法:window.history.pushState(null,null,'download?id=1');完整使用:var oState= {title: '下载' };window.history.pushState(oState, '下载', 'download?id=1')

       特点:
       pushState()可以创建历史
       可以配合popstate事件
       可以使用history.go(-1)返回到上一个页面。

window.addEventListener('popstate', function(evt){
  var state = evt.state;
  document.title= state.title; 
}, false);

replaceState说明
       window.history.replaceState(null,null,'download?id=1');完整使用:var oState= {title: '下载' };window.history.replaceState(oState, '下载', 'download?id=1');
       特点:
       replaceState不会加入到历史记录里面,
       用history.go(-1)会跳过当前页面相当于是history.go(-2)。
具体请看下面代码:

1、页面初次加载,获取patch

document.addEventListener('DOMContentLoaded', () => {
   console.log('load', location.pathname)
})

2、打开一个新路由

// 打开一个新路由
// 【注意】用pushState方法,浏览器不会刷新页面
document.getElementById('btn1').addEventListener('click', function(){
    const state = {name: 'page1'}
    console.log('切换路由到', 'page1')
    history.pushState(state, 'page1', 'page1')
})

3、监听浏览器前进、后退

// 监听浏览器前进、后退
window.onpopstate = (event) => {
    console.log('onpopstate', event.state,location.pathname)
}

       注意:H5 history模式一定要运行在服务器模式下。需要用http-server这样的工具启动服务器。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359