详解从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 相关文章推荐
用javascript自动显示最后更新时间
Mar 15 Javascript
jquery 图片预加载 自动等比例缩放插件
Dec 25 Javascript
关于URL中的特殊符号使用介绍
Nov 03 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
javascript实时获取鼠标坐标值并显示的方法
Apr 30 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
JavaScript判断数组是否存在key的简单实例
Aug 03 Javascript
JS实现页面打印功能
Mar 16 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
angularjs 的数据绑定实现原理
Jul 02 Javascript
基于redis的小程序登录实现方法流程分析
May 25 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实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
php和asp语法上的区别总结
2019/05/12 PHP
php自动加载代码实例详解
2021/02/26 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
Python中的多重装饰器
2015/04/11 Python
python3设计模式之简单工厂模式
2017/10/17 Python
python八大排序算法速度实例对比
2017/12/06 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
python matplotlib库的基本使用
2020/09/23 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
党员检讨书范文
2014/12/27 职场文书
旷工检讨书大全
2015/08/15 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python