区分vue-router的hash和history模式


Posted in Javascript onOctober 03, 2020

一、概念

为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。

前端路由的核心,就在于:改变视图的同时不会向后端发出请求。

为了达到这种目的,浏览器当前提供了以下两种支持:

1.hash——即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。

比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。

它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

2.history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。

这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。

只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

二、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关联在了一起,这就是前端路由。

三、history模式

随着history api的到来,前端路由开始进化了,前面的onhashchange,你只能改变#后面的url片段,而history api则给了前端完全的自由。

history api可以分为两大部分,切换和修改。

切换历史状态包括back、forward、go三个方法,对应浏览器的前进,后退,跳转操作。

修改历史状态包括了pushState、replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

history.pushState({color:'red'}, 'red', 'red')
history.back();
setTimeout(function(){
 history.forward();
 },0)
window.onpopstate = function(event){
  console.log(event.state)
  if(event.state && event.state.color === 'red'){
   document.body.style.color = 'red';
  }
}

通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,这里的页面状态就是页面字体颜色。

其实滚动条的位置,阅读进度,组件的开关的这些页面状态都可以存储到state的里面。

四、history模式的问题

通过history api,我们丢掉了丑陋的#,但是它也有个问题:不怕前进,不怕后退,就怕刷新,f5,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的。

在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它的,所以没有问题。但是在history下,你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会刷出一个404来。

所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

如果使用nginx,后端配置如下:

location / {
 try_files $uri $uri/ /index.html;
}

以上就是区分vue-router的hash和history模式的详细内容,更多关于vue-router hash和history模式的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
用js实现的一个Flash滚动轮换显示图片代码生成器
Mar 14 Javascript
JQuery自定义事件的应用 JQuery最佳实践
Aug 01 Javascript
深入分析js中的constructor和prototype
Apr 07 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
JavaScript制作的可折叠弹出式菜单示例
Apr 04 Javascript
JavaScript函数获取事件源的小例子
May 14 Javascript
纯js代码制作的网页时钟特效【附实例】
Mar 30 Javascript
非常酷炫的Bootstrap图片轮播动画
May 27 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
Seajs是什么及sea.js 由来,特点以及优势
Oct 13 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
Nov 01 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 #Javascript
Chrome插件开发系列一:弹窗终结者开发实战
Oct 02 #Javascript
js通过canvas生成图片缩略图
Oct 02 #Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 #Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 #Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 #Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
Oct 01 #Javascript
You might like
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
js同比例缩放图片的小例子
2013/10/30 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
js实现动态时钟
2020/03/12 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
Python设计模式之观察者模式实例
2014/04/26 Python
python中global与nonlocal比较
2014/11/21 Python
Python每天必学之bytes字节
2016/01/28 Python
python版本的读写锁操作方法
2016/04/25 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python实现按首字母分类查找功能
2019/10/31 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
中秋节晚会开场白
2015/05/29 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis