vue-router中的hash和history两种模式的区别


Posted in Javascript onJuly 17, 2018

众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别。

hash模式

hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件:

window.onhashchange = function(event){
  console.log(event.oldURL, event.newURL);
  let hash = location.hash.slice(1);
  document.body.style.color = hash;
}

上面的代码可以通过改变hash来改变页面字体颜色,虽然没什么用,但是一定程度上说明了原理。

更关键的一点是,因为hash发生变化的url都会被浏览器记录下来,从而你会发现浏览器的前进后退都可以用了,同时点击后退时,页面字体颜色也会发生变化。这样一来,尽管浏览器没有请求服务器,但是页面状态和url一一关联起来,后来人们给它起了一个霸气的名字叫前端路由,成为了单页应用标配。

vue-router中的hash和history两种模式的区别

网易云音乐,百度网盘就采用了hash路由,看起来就是这个样子:
http://music.163.com/#/friend

https://pan.baidu.com/disk/home#list/vmode=list

history路由

随着history api的到来,前端路由开始进化了,前面的hashchange,你只能改变#后面的url片段,而history api则给了前端完全的自由

vue-router中的hash和history两种模式的区别

history api可以分为两大部分,切换和修改,参考MDN

切换历史状态

包括back,forward,go三个方法,对应浏览器的前进,后退,跳转操作,有同学说了,(谷歌)浏览器只有前进和后退,没有跳转,嗯,在前进后退上长按鼠标,会出来所有当前窗口的历史记录,从而可以跳转(也许叫跳更合适):

history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

修改历史状态

包括了pushState,replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

history.pushState({color:'red'}, 'red', 'red'})
window.onpopstate = function(event){
  console.log(event.state)
  if(event.state && event.state.color === 'red'){
    document.body.style.color = 'red';
  }
}
history.back();
history.forward();

通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,这里的页面状态就是页面字体颜色,其实滚动条的位置,阅读进度,组件的开关的这些页面状态都可以存储到state的里面。

history模式怕啥

通过history api,我们丢掉了丑陋的#,但是它也有个毛病:

 不怕前进,不怕后退,就怕刷新,f5,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的,不玩虚的。

在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的,所以没有问题.但是在history下,你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

所以,如果你想在github.io上搭一个单页博客,就应该选择hash模式。

总结

以上所述是小编给大家介绍的vue-router中的hash和history两种模式的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
node.js 一个简单的页面输出实现代码
Mar 07 Javascript
js jquery数组介绍
Jul 15 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
Webpack的dll功能使用
Jun 28 Javascript
layui table 参数设置方法
Aug 14 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 Javascript
原生JavaScript实现五子棋游戏
Nov 09 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
Dec 24 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 #Javascript
SVG实现时钟效果
Jul 17 #Javascript
JS中实现隐藏部分姓名或者电话号码的代码
Jul 17 #Javascript
基于D3.js实现时钟效果
Jul 17 #Javascript
vue生成token并保存到本地存储中
Jul 17 #Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 #Javascript
使用svg实现动态时钟效果
Jul 17 #Javascript
You might like
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
Python采用raw_input读取输入值的方法
2014/08/18 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Python 列表反转显示的四种方法
2020/11/16 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
仓管岗位职责范本
2014/02/08 职场文书
法制宣传月活动方案
2014/05/11 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
大学生党员个人总结
2015/02/13 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
辞职信怎么写?
2019/05/21 职场文书