详解从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 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
Nov 06 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
Jan 14 Javascript
Javascript复制实例详解
Jan 28 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
使用Web Uploader实现多文件上传
Jun 08 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
node上的redis调用优化示例详解
Oct 30 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
php异常处理使用示例
2014/02/25 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
Document 对象的常用方法
2009/07/31 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
Python学习之用pygal画世界地图实例
2017/12/07 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
SQL SERVER面试资料
2013/03/30 面试题
销售总监工作职责
2013/11/21 职场文书
网吧消防安全制度
2014/01/28 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
优秀家长自荐材料
2014/08/26 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
2014年个人售房协议书
2014/10/30 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
员工手册编写范本
2015/05/14 职场文书
Linux安装Docker详细教程
2022/07/07 Servers