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分秒倒计时器实现方法
Feb 02 Javascript
JavaScript通过事件代理高亮显示表格行的方法
May 27 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
AngularJS 异步解决实现方法
Jun 12 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
收集前端面试题之url、href、src
Mar 22 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
js实现数字跳动到指定数字
Aug 25 Javascript
JS前端轻量fabric.js系列之画布初始化
Aug 05 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
PHP类的反射用法实例
2014/11/03 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
javascript验证身份证号
2015/03/03 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
JavaScript运行原理分析
2018/02/09 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
从零学Python之入门(四)运算
2014/05/27 Python
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
python绘制圆柱体的方法
2018/07/02 Python
Django model反向关联名称的方法
2018/12/15 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
经典c++面试题四
2015/05/14 面试题
企业内控岗位的职责
2014/02/07 职场文书
大学生村官承诺书
2014/03/28 职场文书
活动总结书
2014/05/08 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL