前后端分离:利用Ajax,可以在不刷新浏览器的情况下异步数据请求交互。

前端路由:匹配不同的url路径,进行解析,加载不同组件,动态渲染内容,不会向后端发出请求。(VueRouter)

单页应用SPA(只有一个html文件),页面交互和页面刷新都是无刷新的。前后端分离+前端路由来实现。

VueRouter有两种模式:Hash模式、History模式,默认是Hash模式,可以通过mode属性进行设置。

mode history对象创建依据的类
hash new HTML5History(this, options.base)
history new HashHistory(this, options.base, this.fallback)
abstract new AbstractHistory(this, options.base)

一、Hash模式

Hash模式是VueRouter的默认模式,工作原理是利用hashchange事件监听hash的变化,即#xxx,然后通过。可以在window对象上监听这个事件。

window.onhashchange = function(event){// event.oldURL 表示原来的URL,有#则含#及其后字符串// event.newURL 表示现在的URL,有#则含#及其后字符串
}

HashHistory构造函数:

HashHistory.push() // 将新路由添加到浏览器历史访问栈

HashHistory.replace() // 将浏览器历史访问栈栈顶路由替换成新路由

由于hash变化的URL都被记录在浏览器历史访问栈,尽管浏览器没有访问服务器,但页面内容和URL一一对应,可以使用浏览器的前进和后退功能。

触发hashchange事件的几种情况如下

1. 浏览器的前进、后退操作会触发window.location.hash的变化,从而触发hashchange事件。

2. 当只改变浏览器地址栏URL的哈希值,此时回车,浏览器不会发送任何请求给服务器,只会触发hashchange事件。

3. 当在浏览器地址栏URL中输入一个包含hash的url,此时回车,浏览器会发送除hash外的地址请求给服务器,请求完成,设置hash值,触发hashchange事件。

4. 标签<a>的href属性可以设置为页面某元素的ID(如#top),点击跳转到该ID元素所在区域,同时浏览器自动设置window.location.hash属性,地址中的hash也会变化成其ID(如#top),触发hashchange事件。

二、History模式

Hash模式的缺点:

1. hash本来用于做页面定位,若用来做路由,原锚点公共失效。

2. Hash模式的传参基于url,若有复杂的数据会有体积的限制。History模式除了可以利用url传参,还可以将数据存放一个特定的对象中。

3. 路径书写不简约。

History模式的书写更加简洁,去掉#。充分利用HTML5 History Interface中新增的pushState()和replaceState()方法,这俩个方法应用于浏览器的历史记录栈(window.history指向History对象,表示当前窗口的浏览历史),使得不刷新页面改变url地址。在已有的back()、forward()、go()(接受一个整数作为参数,若参数超过实际存在的网址范围,该范围无效果;若不指定参数,默认参数为0,相当于刷新页面)的基础上,提供了对历史记录修改的功能。

前进和后退操作时都不会请求服务器,而是通过popstate事件监听,刷新页面才会向服务器发起请求。

2.1 History.pushSate()

用于在浏览器历史访问栈中添加一条记录,该方法不会刷新页面,只是导致History对象发生变化,地址栏会发生变化。使用该方法后,可以用History.state读出状态对象。

History.pushSate(object, title, url)

object:一个对象,通过pushState方法可以将该对象内容传递到新页面中,若不需要,填null。

title:标题,几乎没有浏览器支持该参数,传一个空字符串。

url:新的网站,需与当前页面处于同一个域。不指定默认为当前地址。若设置跨域地址,会报错。

若在url中设置#xxx,不会触发hashchange事件。

2.2 History.replaceSate()

用于修改History对象的当前记录,用法同History.pushSate(object, title, url)。

2.3 popstate事件

仅仅调用pushSate()或replaceState()方法,不会触发该事件。

只有用户点击浏览器前进和后退,或使用脚本调用history.back()、history.forward()、history.go()方法才会触发popstate事件。

该事件仅针对同一个文档,若浏览历史的切换,导致加载不同的文档,该事件也不会触发。

第一次加载不会触发popstate事件。

其回调函数的参数为event对象,state属性指向pushSate()和replaceState()方法提供的History的当前对象,也可以通过history.state获得该对象。


当页面刷新时,需要向服务器发起请求。History模式的url会全部传给服务器,即服务器需要匹配完成的URL,否则报404错误,需要后端配置路由。Hash模式的url的哈希值不会携带在请求中。

三、使用路由模块实现页面跳转的方式

1. 修改地址栏

2. this.$router.push('路由地址')

3. <router-link  to="路由地址"></router-link>

四、Hash模式和History模式的相同点和不同点

相同点:

1. 都是VueRouter的模式配置选项。

2. 都可以用作SPA(单页面应用)的实现,实现前端路由,不向服务器发起请求,动态渲染页面。

不同点:

1. Hash模式需要#xxx(哈希值),History模式书写更简约。

2. Hash模式是通过window对象监听hashchange事件,根据hash值的变化来动态渲染页面的;History模式是通过window对象监听popstate事件,当浏览器前进和后退时,获取当前history对象状态即history.state来动态渲染组件。

3. Hash模式创建history对象是依赖HashHistory构造函数;History模式创建history对象是依赖HTML5History构造函数。

Hash模式利用HashHistory.push()和HashHistory.replace()可以将hash变化的URL都被记录在浏览器历史访问栈,实现页面内容和URL一一对应,从而可以使用浏览器的前进和后退功能。

History模式利用HTML5History.pushState()和HTML5History.replaceState()修改页面的url地址,修改history对象的状态,而不刷新页面。

4. Hash模式通过携带在url中传递参数;History模式既可以通过携带在url中传递参数,也可以将数据存放在一个特定的对象中。

5. Hash模式只有hash值设置为不同于上次时,才会被添加进历史记录栈;History模式可以记录相同的url。

6. Hash模式只能修改#之后的部分;History模式的pushState设置的新的url可以是于当前url同源的任意url。

VueRouter的两种模式相关推荐

  1. “约见”面试官系列之常见面试题之第一百零二篇之vue-router的两种模式(建议收藏)

    众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. hash模式 hash模式背后的原理是onhashchange事件,可以在window对象上监听这个 ...

  2. 关于vue-router的两种模式以及原理

    一.简介 众所周知vue-router 有两种模式 一种是hash模式 一种是history模式 首先是hash模式 hash --即地址栏URL中的#符号 比如这个URL:http://www.ba ...

  3. vue-router的两种模式(hash和history)及区别

    为什么要有hash 和history? 对于Vue这类渐进式前端开发框架,为了构建SPA(单页面应用),需要引入前端路由系统,这也就是Vue-Router存在的意义.前端路由的核心,就在于--改变试图 ...

  4. vue-router的两种模式及区别

    为什么要有 hash 和 history? 对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义.前端路由的核心,就在 ...

  5. vue-router的两种模式的区别

    1.大家都知道vue是一种单页应用,单页应用就是仅在页面初始化的时候加载相应的html/css/js一单页面加载完成,不会因为用户的操作而进行页面的重新加载或者跳转,用javascript动态的变化h ...

  6. vue-router mode两种模式

    mode: 'hash',//hash模式下,浏览器地址不规整,带有# mode: 'history',//history模式下,浏览器地址规整,但需要后台支持 复制代码

  7. vue-router 两种模式的区别

    vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. **hash模式** hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事 ...

  8. hash和history两种模式的区别+SpringBoot的特定配置

    今天学习到vue-router有两种模式,一种是hash,一种是history模式 这两种模式对于后端来说有点区别 1,hash模式 这个模式是链接后拼接/#/这样的形式,在实际请求时并不加入#后面的 ...

  9. vue路由的两种模式:hash与history的区别

    前言:众所周知,vue-router有两种模式,hash模式和history模式,下面来看看两者的区别. 一.基本情况 直观区别:hash模式url带#号,history模式不带#号. 1.hash模 ...

最新文章

  1. 《Maven官方指南》指南第三方部署到远程仓库
  2. 模拟器中文输入法设置
  3. 【Android】事件传递:向下拦截,向上处理
  4. java实用教程——组件及事件处理——概述
  5. 思维导图系列之Redis知识梳理
  6. 为什么单片机的代码在Flash中运行,单片机的代码运行位置跟电脑有什么不同?
  7. C#把Xml转换为DataSet的两种方法
  8. js中 attachEvent事件
  9. 解决直接读取webapp下的文件404问题
  10. 百度云安装mysql_mysql5.7 安装版本配置教程+百度云资源分享
  11. word使用:默认粘贴方式的更改
  12. python sys.getsizeof 变量的大小
  13. Shiro权限管理框架详解
  14. 一整只烧鹅价格=烧鹅上庄价格+烧鹅下庄价格这个关系不因货币变掉而变
  15. 发现几个有趣的公众号!
  16. 63家企业上榜!华为云优秀合作伙伴公布!
  17. MBTI测试结果:您的性格类型倾向为“ ENFP ”
  18. Axure rp 8中继器基础使用
  19. 【渝粤教育】广东开放大学 管理基础与实务 形成性考核 (42)
  20. 模拟退火算法介绍及matlab实现

热门文章

  1. 华为h22h05服务器装系统_华为云手机很高大上?花半个小时,我也“自研”出了一台云手机...
  2. PPTP 在Centos 7.1 建立方法与失效处理
  3. c语言程序设计小球弹跳,c语言小游戏程序之弹跳小球的实现代码
  4. 终止代码 PAGE_FAULT_IN_NONPAGED AREA蓝屏解决办法<VM虚拟机>
  5. tree老师:PSSH自动化运维实战
  6. MCL(minos Configuration Language)
  7. 项目管理永远是资源少,时间不够,需求不断变化……
  8. 市场调研报告-全球与中国广告创作软件市场现状及未来发展趋势
  9. 微信app需要服务器带宽,微信需要多大带宽?微信的最低带宽要求。
  10. 怎样释放计算机网络宽带限制,如何释放Win7系统限制可保留带宽的20%网速