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 相关文章推荐
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
Dec 24 Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
Jun 20 Javascript
JS实现验证码倒计时的注册页面
Jan 02 Javascript
vue 路由页面之间实现用手指进行滑动的方法
Feb 23 Javascript
浅谈Node框架接入ELK实践总结
Feb 22 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
在vue中使用echars实现上浮与下钻效果
Nov 08 Javascript
JavaScript实现电灯开关小案例
Mar 30 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
js图片轮播效果实现代码
2020/04/18 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
python读取几个G的csv文件方法
2019/01/07 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
小学生新年寄语
2014/04/03 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
土地转让协议书
2014/04/15 职场文书
工作失职检讨书
2015/01/26 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL