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
Nov 25 Javascript
预加载css或javascript的js代码
Apr 23 Javascript
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
18个非常棒的jQuery代码片段
Nov 02 Javascript
详解vue axios中文文档
Sep 12 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
layui的表单提交以及验证和修改弹框的实例
Sep 09 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
Python标准库之collections包的使用教程
2017/04/27 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python手写均值滤波
2020/02/19 Python
python自动下载图片的方法示例
2020/03/25 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
小学红领巾中秋节广播稿
2014/01/13 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
单位委托书
2014/10/15 职场文书
生日答谢词
2015/01/05 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS