详解从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 锁定弹出层实现代码
Feb 23 Javascript
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
Feb 17 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
关于Angular2 + node接口调试的解决方案
May 28 Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 Javascript
详解使用React.memo()来优化函数组件的性能
Mar 19 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 Javascript
JavaScript实现点击切换功能
Jan 27 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 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
PHP7新特性简述
2017/06/11 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
用Python逐行分析文件方法
2019/01/28 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
Python3中列表list合并的四种方法
2019/04/19 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
铲车司机岗位职责
2014/03/15 职场文书
优秀教师演讲稿
2014/05/06 职场文书
企业公益活动策划方案
2014/08/24 职场文书
二人合伙经营协议书
2014/09/13 职场文书
中学教师个人总结
2015/02/10 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL