详解从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实战之品牌展示列表效果
Apr 10 Javascript
一个简单的js树形菜单
Dec 09 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
学习jQuey中的return false
Dec 18 Javascript
jQuery实现的超简单点赞效果实例分析
Dec 31 Javascript
mui上拉加载功能实例详解
Apr 13 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
Mar 23 Javascript
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 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变量的值类型和引用类型
2015/10/21 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python基础教程之lambda表达式使用方法
2014/02/12 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
python相对企业语言优势在哪
2020/06/12 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
家属慰问信
2015/02/14 职场文书
护理工作个人总结
2015/03/03 职场文书
上甘岭观后感
2015/06/10 职场文书
单位同意报考证明
2015/06/17 职场文书
宣传稿格式范文
2015/07/23 职场文书