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数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
angularjs指令之绑定策略(@、=、&)
Apr 13 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
bootstrap-table组合表头的实现方法
Sep 07 Javascript
详解使用React.memo()来优化函数组件的性能
Mar 19 Javascript
vue router 传参获取不到的解决方式
Nov 13 Javascript
使用refresh_token实现无感刷新页面
Apr 26 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
javascript 短路法代码精简
2009/08/20 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
js原型链原理看图说明
2012/07/07 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
node.js的事件机制
2017/02/08 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
社会学专业学生职业规划书
2014/02/07 职场文书
小学语文国培感言
2014/03/04 职场文书
岗位聘任书范文
2014/03/29 职场文书
社区清明节活动总结
2014/07/04 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
大学生读书笔记大全
2015/07/01 职场文书