详解从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 相关文章推荐
js实现的网站首页随机公告随机公告
Mar 14 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
Aug 19 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 Javascript
详解vuex 中的 state 在组件中如何监听
May 23 Javascript
javaScript日期工具类DateUtils详解
Dec 08 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
微信小程序开发之自定义tabBar的实现
Sep 06 Javascript
微信小程序使用蓝牙小插件
Sep 23 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
Feb 24 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 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
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python提取网页中超链接的方法
2016/09/18 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
摄影助理岗位职责
2014/02/07 职场文书
给学校的建议书范文
2014/05/15 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
公诉意见书范文
2015/06/05 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
2016年寒假家长评语
2015/10/10 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书