区分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 相关文章推荐
jquery $.getJSON()跨域请求
Dec 21 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
Mar 20 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
解决jQuery使用append添加的元素事件无效的问题
Aug 30 jQuery
详解JavaScript的变量
Apr 04 Javascript
小程序最新获取用户昵称和头像的方法总结
Sep 23 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 Javascript
React Native登录之指纹登录篇的示例代码
Nov 03 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 Javascript
详解TypeScript的基础类型
Feb 18 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
php 方便水印和缩略图的图形类
2009/05/21 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
详解js闭包
2014/09/02 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
酒店总经理职务说明书
2014/02/26 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
期中考试反思800字
2014/05/01 职场文书
个人考核材料
2014/05/15 职场文书
机关保密承诺书
2014/06/03 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
新闻通讯稿范文
2015/07/22 职场文书
诚信教育主题班会
2015/08/13 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
协议书格式模板
2016/03/24 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书