详解从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操作word的参考代码
Oct 26 Javascript
juqery 学习之四 筛选过滤
Nov 30 Javascript
Javascript base64编码实现代码
Dec 02 Javascript
SOSO地图JS画出标注和中心点以html形式运行
Aug 09 Javascript
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
May 14 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 Javascript
jquery中用函数来设置css样式
Dec 22 Javascript
通过命令行创建vue项目的方法
Jul 20 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
Sep 23 Javascript
封装 axios+promise通用请求函数操作
Aug 11 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
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python实现爬虫下载美女图片
2015/07/14 Python
Python while 循环使用的简单实例
2016/06/08 Python
使用Python对Csv文件操作实例代码
2017/05/12 Python
Python绘制七段数码管实例代码
2017/12/20 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
中学生班主任评语
2014/01/30 职场文书
主题班会演讲稿
2014/05/22 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
廉政承诺书范文
2015/04/28 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
详解MindSpore自定义模型损失函数
2021/06/30 Python
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android