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与CSS复习(二)
Jun 29 Javascript
javascript中万恶的function实例分析
May 25 Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 Javascript
使用JS CSS去除IE链接虚线框的三种方法
Nov 14 Javascript
JavaScript中的依赖注入详解
Mar 18 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
May 26 Javascript
js全选按钮的实现方法
Nov 17 Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
Vue中JS动画与Velocity.js的结合使用
Feb 13 Javascript
JavaScript页面倒计时功能完整示例
May 15 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 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实现今天是星期几的几种写法
2013/09/26 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
JavaScript版代码高亮
2006/06/26 Javascript
js停止输出代码
2008/07/20 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
深入学习Python中的装饰器使用
2016/06/20 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python hashlib加密实现代码
2019/10/17 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
怎么写好自荐书
2014/03/02 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
小学语文教学随笔
2015/08/14 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
mysql 获取相邻数据项
2022/05/11 MySQL
nginx 配置指令之location使用详解
2022/05/25 Servers