详解从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 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
Nov 13 Javascript
juqery 学习之三 选择器 子元素与表单
Nov 25 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
全面解析Bootstrap表单使用方法(表单控件)
Nov 24 Javascript
jquery 遍历数组 each 方法详解
May 25 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
使用rollup打包JS的方法步骤
Dec 05 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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
PDO::exec讲解
2019/01/28 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python中random模块生成随机数详解
2016/03/10 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
python的json包位置及用法总结
2020/06/21 Python
python中count函数知识点浅析
2020/12/17 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
Java servlet面试题
2012/03/04 面试题
企事业单位求职者的自我评价
2013/12/28 职场文书
环保建议书
2014/03/12 职场文书
工程质量承诺书
2014/03/27 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
个人收入证明范本
2015/06/12 职场文书
《将心比心》教学反思
2016/02/23 职场文书