Vue的两种路由模式: hash、history;默认是hash模式; 前端路由(改变视图的同时不会向后端发出请求)

一、什么是hash模式和history模式?

  hash模式:是指url尾巴后的#号以及后面的字符。hash也称为锚点,本身是用来做页面定位的,它可以使对应的id元素显示在可视区域。hash虽然出现在url中,但不会被包括在http请求中,对后端完全没有影响,因此改变hash不会被重新加载页面。

  hash值的变化不会导致浏览器向服务器发出请求,而hash改变会触发hashchange事件(只改变#后面的url片段);hash发生变化url都会被浏览器记录下来,从而可以使用浏览器的前进和后退。又称为前端路由,单页面应用的标配。

  history模式:

二、hash和history模式背后的原理?

  hash:hashchange事件,可以在window对象上监听这个事件:

window.location.hash = 'qq'  // 设置url的hash,会在当前的url后加上'#qq'   
ar hash = window.location.hash // 值为 '#qq'
window.addEventListener('hashchange',function() {
// 监听hash变化,点击浏览器的前进后退会触发
})

  history:利用了HTML5新增的pushState()和replaceState()方法,需要特定的浏览器支持;

  --history 的api可以分为两个部分:切换和修改(参考MDN)

  --切换历史状态包括back\forward\go 方法: history.go()\history.forward()\history.back()

  ==修改历史状态包括pushState和replaceState两个方法

window.history.pushState(state, title, url)
// state: 需要保存的数据,这个数据在触发popstate事件时,可以在event.state里获取
// title:标题,一般为null
// url:设定新的历史记录url。新的url与当前的url的origin必须时一样的,url可以是绝对路径也可以是相对路径
// 例如:当前的url: https://www.baidu.com/a/,执行history.pushState(null, null, './qq/'),则变成 https://www.baidu.com/a/qq/,
// 执行 history.pushState(null, null, '/qq/'),则会变成https://baidu.com/qq/ window.history.replaceState(state,title,url)
// 与pushState方法一样,但它是修改当前的历史记录,而pushState是创建新的历史记录

window.addEventListener('popstate',function(){
// 监听浏览器的前进和后退事件,pushState和replaceState方法不会触发
})
// history模式:改变url的方式会导致浏览器向服务器端发送请求,我们需要在服务器端做处理:如果匹配不到任何的静态页面,则应该始终返回同一个html页面。搭配前端路由的404页面支持。

  hash和history都是属于浏览器自身的特性,Vue-router只是利用了这两个特性(通过调用浏览器接口)来实现前端路由。

三、缺点:

  hash:

    1.本来是拿来做页面定位的,如果拿来做路由的话,原来的锚点功能就不能用了;

    2.传参是基于url的,如果传递复杂的数据,会又体积的限制,而history模式不仅可以在url里放参数,还可以将数据放在一个特定的对象中。

  history:页面F5书刷新时会出现404; 前端的 URL 必须和实际向后端发起请求的 URL 一致,否则会返回404错误。

Vue-router(前端路由)的两种路由模式的更多相关文章

  1. 浅析使用vue-router实现前端路由的两种方式

    关于vue-router 由于最近的项目中一直在使用vue,所以前端路由方案也是使用的官方路由vue-router,之前在angularJS项目中也是用过UI-router,感觉大同小异,不过很显然v ...

  2. vue路由的两种模式配置以及history模式下面后端如何配置

    vue路由的两种模式配置以及history模式下面后端如何配置 1.hash ——即地址栏URL中的#符号.hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变has ...

  3. vue中使用echarts的两种方法

    在vue中使用echarts有两种方法一.第一种方法1.通过npm获取echarts npm install echarts --save 2.在vue项目中引入echarts 在 main.js 中 ...

  4. Vue路由器的hash和history两种工作模式 && Vue项目编译部署

    1 # 一.Vue路由器的两种工作模式 2 # 1.对于一个uri来说,什么是hash值? 井号及其后面的内容就是hash值. 3 # 2.hash值不会包括含在HTTP请求中,即:hash值不会带给 ...

  5. 用easyui从servlet传递json数据到前端页面的两种方法

    用easyui从servlet传递json数据到前端页面的两种方法 两种方法获取的数据在servlet层传递的方法相同,下面为Servlet中代码,以查询表中所有信息为例. //重写doGet方法 p ...

  6. ASP.Net的两种开发模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  7. JAVA学习篇--JAVA两种编程模式控制

    在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...

  8. IIS在ASP.NET Core下的两种部署模式

    KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...

  9. java web学习总结(二十九) -------------------JavaBean的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

随机推荐

  1. BMZCTF SDNISC2020_过去和现在

    SDNISC2020_过去和现在 打开附件就一张图片 根据题意感觉是图片中隐藏了什么信息 使用binwalk -e分离这里foremost不行 三个文件查看在第一个中发现flag

  2. 树莓派系统安装(ubuntu版本)无需屏幕

    0.前提 所需物品:一个手机.一台电脑.一个树莓派.一张tf卡和一个读卡器.所需软件:Win32DiskImager.putty还需要ubuntu系统镜像源.这些我都放在百度网盘上了链接:https: ...

  3. 《剑指offer》面试题3:二维数组中的查找

    面试题3:二维数组中的查找 面试题3:二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的个二维数组和一个整数,判 ...

  4. Numpy求解线性方程组

    Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证

  5. 程序人生:织梦dedecms后台/会员验证码关闭

    dedecms默认是所有的功能几乎只要用到验证码的地方我们都需要验证的,如果要关闭一些验证功能我们可以参考下面的教程,这里介绍了关闭后台,留言板,会员系统等验证码功能关闭了.提示:支持DedeCMS ...

  6. 详解 CSS 属性 - position

    postion 属性定义了一个元素在页面布局中的位置以及对周围元素的影响.该属性共有5个值: position: absolute position: relative position: fixed ...

  7. 微信小程序——gulp处理文件

    懒癌直接贴代码,想写在写因为最近搞了一下小程序,直接使用微信的开发者工具搞感觉有点不习惯,并且看了几篇给小程序瘦身的博客,决定给自己的项目做一套配置文件,使用gulp来支持sass scss文件编译以 ...

  8. HTML5 Canvas学习之路(六)

    一个炫酷的计时器 在慕课网看到一个canvas的课,感觉很炫酷,就把它看完了,然后记下来.http://www.imooc.com/learn/133 第一步:绘制要显示的时间 拿小球来绘制具体的数字 ...

  9. java中throws子句是怎么用的?工作原理是什么

    7.throws子句 马克-to-win:当你的方法里抛出了checked异常,如你不catch,代表你当时不处理(不想处理或没条件处理),但你必须得通过"throws那个异常"告 ...

  10. ubantu系统之安装notepadqq

    Ubuntu下的安装方法:     sudo add-apt-repository ppa:notepadqq-team/notepadqq     sudo apt-get update     s ...