一文了解vue-router之hash模式和history模式


Posted in Javascript onMay 31, 2019

当前版本: 3.0.3

类目录: src/history/base.js

hash模式

即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。比如这个 URL: http://www.abc.com/#/hello ,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

history模式

利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

HTML5History实现

使用window.addEventListener('popstate')监听浏览器滚动行为,然后判断配置是否有scrollBehavior, 有就调用handleScroll方法来处理

滚动行为: 使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

handleScroll

<!-- 等待页面渲染完才进行滚动的操作 -->
 router.app.$nextTick(() => {
   <!-- 初始化数据 -->
  const position = getScrollPosition()
  const shouldScroll = behavior.call(router, to, from, isPop ? position : null)

  if (!shouldScroll) {
   return
  }
  <!-- 判断是否是Promise,官网说支持异步 -->
  if (typeof shouldScroll.then === 'function') {
   shouldScroll.then(shouldScroll => {
    scrollToPosition((shouldScroll: any), position)
   }).catch(err => {
    if (process.env.NODE_ENV !== 'production') {
     assert(false, err.toString())
    }
   })
  } else {
   scrollToPosition(shouldScroll, position)
  }
 })

scrollToPosition

function scrollToPosition (shouldScroll, position) {
 const isObject = typeof shouldScroll === 'object'
 <!-- 对position进行初始化的操作 -->
 if (isObject && typeof shouldScroll.selector === 'string') {
  const el = document.querySelector(shouldScroll.selector)
  if (el) {
   let offset = shouldScroll.offset && typeof shouldScroll.offset === 'object' ? shouldScroll.offset : {}
   offset = normalizeOffset(offset)
   position = getElementPosition(el, offset)
  } else if (isValidPosition(shouldScroll)) {
   position = normalizePosition(shouldScroll)
  }
 } else if (isObject && isValidPosition(shouldScroll)) {
  position = normalizePosition(shouldScroll)
 }
  使用window.scrollTo来进行滚动处理
 if (position) {
  window.scrollTo(position.x, position.y)
 }
}

push

push操作也是 HTML5History模式下的一个比较关键的方法,他使用pushState来进行跳转操作,然后handleScroll来进行滚动\

export function pushState (url?: string, replace?: boolean) {
  <!-- 保存当前页面的滚动位置 -->
 saveScrollPosition()
 // try...catch the pushState call to get around Safari
 // DOM Exception 18 where it limits to 100 pushState calls
 const history = window.history
 try {
   <!-- 判断是哪种操作动作 -->
  if (replace) {
   history.replaceState({ key: _key }, '', url)
  } else {
   _key = genKey()
   history.pushState({ key: _key }, '', url)
  }
 } catch (e) {
  window.location[replace ? 'replace' : 'assign'](url)
 }
}

HashHistory实现

对于HashHistory的实现,和HTML5History的区别是在于Listener的方式和跳转的方式

Listener的方式这里是使用了hashchange,但是如果需要滚动行为就会去监听popstate

window.addEventListener(supportsPushState ? 'popstate' : 'hashchange')

跳转的方式会判断是否需要滚动,不需要就直接使用window.location.hash

function pushHash (path) {
 if (supportsPushState) {
  pushState(getUrl(path))
 } else {
  window.location.hash = path
 }
}

总结

以上所述是小编给大家介绍的vue-router之hash模式和history模式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
菜鸟javascript基础整理1
Dec 06 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
Dec 30 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
Feb 27 Javascript
javascript时区函数介绍
Sep 14 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
JavaScript实现的多个图片广告交替显示效果代码
Sep 04 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
JS对HTML表格进行增删改操作
Aug 22 Javascript
AngularJS中的按需加载ocLazyLoad示例
Jan 11 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
May 31 #Javascript
微信小程序环境下将文件上传到OSS的方法步骤
May 31 #Javascript
Vue Router history模式的配置方法及其原理
May 30 #Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 #Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 #Javascript
了解JavaScript函数中的默认参数
May 30 #Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 #Javascript
You might like
人族 Terran 魔法与科技
2020/03/14 星际争霸
PHP 采集程序原理分析篇
2010/03/05 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
python多线程用法实例详解
2015/01/15 Python
速记Python布尔值
2017/11/09 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python实现Event回调机制的方法
2019/02/13 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
css3的transition属性详解
2014/12/15 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
春节联欢会主持词
2014/03/24 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
企业标语口号
2014/06/10 职场文书
奶茶店创业计划书
2014/08/14 职场文书
Python基本数据类型之字符串str
2021/07/21 Python