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 相关文章推荐
可以将word转成html的js代码
Apr 11 Javascript
iphone safari不支持position fixed的解决方法
May 04 Javascript
Web跨浏览器进程通信(Web跨域)
Apr 17 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
浅析Cookie中的Path与domain
Dec 18 Javascript
javascript判断office版本示例
Apr 11 Javascript
JQuery遍历DOM节点的方法
Jun 11 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
Aug 01 Javascript
Vue.js每天必学之过滤器与自定义过滤器
Sep 07 Javascript
jquery请求servlet实现ajax异步请求的示例
Jun 03 jQuery
Vue结合SignalR实现前后端实时消息同步
Sep 19 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 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中对数据库操作的封装
2006/10/09 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python中str.format()详解
2017/03/12 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
如何清空python的变量
2020/07/05 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
abstract class和interface有什么区别
2013/08/04 面试题
旅游个人求职信范文
2014/01/30 职场文书
公司活动方案范文
2014/03/06 职场文书
平安工地建设方案
2014/05/06 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
vue动态绑定style样式
2022/04/20 Vue.js