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 相关文章推荐
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
比较详细的关于javascript 解析json的代码
Dec 16 Javascript
js Event对象的5种坐标
Sep 12 Javascript
node.js中Socket.IO的进阶使用技巧
Nov 04 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
Feb 03 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
Mar 01 Javascript
jQuery基于扩展实现的倒计时效果
May 14 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
Element Dialog对话框的使用示例
Jul 26 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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP的5个安全措施小结
2012/07/17 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
flask框架视图函数用法示例
2018/07/19 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
管理信息系学生的自我评价
2014/01/11 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
公司租房协议书
2014/10/14 职场文书
学生逃课检讨书
2015/02/17 职场文书
医院见习总结
2015/06/24 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python