详解从Vue-router到html5的pushState


Posted in Javascript onJuly 21, 2018

最近在用vue的时候突然想到一个问题

首先,我们知道vue实现的单页应用中一般不会去刷新页面,因为刷新之后页面中的vuex数据就不见了。

其次,我们也知道一般情况下,url变更的时候,比如指定location.href、history.push、replace等,页面就会刷新。

那么问题来了,vue页面的页面跳转时怎么实现的?没刷新页面么?没刷新页面,又要改变url,加载新内容怎么做的?

去翻了一下vue-router的源码,找到这样一段

export class HTML5History extends History {
  ...

 push (location: RawLocation, onComplete?: Function, onAbort?: Function) {
  const { current: fromRoute } = this
  this.transitionTo(location, route => {
   pushState(cleanPath(this.base + route.fullPath))
   handleScroll(this.router, route, fromRoute, false)
   onComplete && onComplete(route)
  }, onAbort)
 }

 replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {
  const { current: fromRoute } = this
  this.transitionTo(location, route => {
   replaceState(cleanPath(this.base + route.fullPath))
   handleScroll(this.router, route, fromRoute, false)
   onComplete && onComplete(route)
  }, onAbort)
 }
 ...
}

再看看方法内部

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)
 }
}

答案就是html5在history中新增加的方法:pushState和replaceState。这两个又是干啥的呢?(两个十分类似,以下以pushState为例说明,区别和push与replace一致)

HTML5的pushState()

首先看看这个是干什么的

pushState方法就是向history中push一条记录,更改页面url,但是不刷新页面,不刷新页面,不刷新页面。不刷新页面,这点很关键,这和下面的操作很相似

window.location.href = window.location.href + '#a=b'

知道干嘛的了,再看看API怎么用的

history.pushState(state, title, url);

state是一个对象,具体内容除了最大640KB之外没有别的限制,比如在vue中是生成了一个key存进去了。若无特殊需要传个null即可。这个state可以在history或者popstate的事件中看到

history中的

详解从Vue-router到html5的pushState

popstate中的

详解从Vue-router到html5的pushState

title这个参数目前没什么用处,可能是给以后预留的参数,暂时用null就好了

url很明显,就是替换后的url了。url可以接受绝对地址和相对地址,设置绝对地址的时候,要保证域名和当前域名一致,否则汇报如下错误

Uncaught DOMException: Failed to execute 'pushState' on 'History': A history state object with URL 'https://www.baidu.com/' cannot be created in a document with origin 'https://mocard-aliyun1.chooseway.com:8443' and URL 'https://mocard-aliyun1.chooseway.com:8443/views/h5/indexasdasd'.
at History.pushState (https://aixuedaiimg.oss-cn-hangzhou.aliyuncs.com/static/m/js/alog/v1.0.0/alog.min.js:1:23259)
at <anonymous>:1:9

HTML5的popstate()

popstate与pushState相对应,主要在页面url变更的时候触发,一般绑定在window对象下

window.addEventListener('popstate', e => {
 console.log('popstate', )
})

前面pushState中传入的state对象,可以在这边接收到,并根据需要去做一些处理。

说到这,vue-router是怎么实现页面“刷新”但不刷新的就知道了吧。

vue-router就是利用pushState这个属性,在页面前进的时候动态改变history的内容,添加一条记录,接着location跟着改变。同时根据router前往的路由获取对应的js资源文件并挂载到目标dom上实现页面内容的更新,但是页面本身并没有刷新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
Dec 16 Javascript
使用jquery操作session方法分享
Jan 22 Javascript
jQuery焦点图插件SaySlide
Dec 21 Javascript
简单谈谈gulp-changed插件
Feb 21 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
基于Vue CSR的微前端实现方案实践
May 27 Javascript
javascript+Canvas实现画板功能
Jun 23 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
何时使用Map来代替普通的JS对象
Apr 29 Javascript
JS实现面向对象继承的5种方式分析
Jul 21 #Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
Jul 21 #Javascript
vue项目中添加单元测试的方法
Jul 21 #Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 #Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 #jQuery
jQuery实现输入框的放大和缩小功能示例
Jul 21 #jQuery
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 #jQuery
You might like
php抓取页面的几种方法详解
2013/06/17 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
js html实现计算器功能
2018/11/13 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
pyside写ui界面入门示例
2014/01/22 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
分析Python中解析构建数据知识
2018/01/20 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Python批量启动多线程代码实例
2020/02/18 Python
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
大学生自我鉴定书
2014/03/24 职场文书
2014年国庆节寄语
2014/09/19 职场文书
初中政治教师教学反思
2016/02/23 职场文书
导游词之西安骊山
2019/12/20 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
MySQL表的增删改查基础教程
2021/04/07 MySQL
js 数组 fill() 填充方法
2021/11/02 Javascript
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技