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 相关文章推荐
asp.net和asp下ACCESS的参数化查询
Jun 11 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
Jun 07 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
JavaScript中的惰性载入函数及优势
Feb 18 Javascript
vue webpack build资源相对路径的问题及解决方法
Jun 04 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 时间转换Unix时间戳代码
2010/01/22 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
python发送伪造的arp请求
2014/01/09 Python
批处理与python代码混合编程的方法
2016/05/19 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
python 串行执行和并行执行实例
2020/04/30 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
2014年银行员工年终自我评价
2014/09/19 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
碧霞祠导游词
2015/02/09 职场文书
后天观后感
2015/06/08 职场文书
python解决12306登录验证码的实现
2021/04/18 Python