详解从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 相关文章推荐
arguments对象
Nov 20 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
Jun 25 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
JavaScript访问字符串中单个字符的两种方法
Jul 03 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
Jul 13 Javascript
jquery实现加载进度条提示效果
Nov 23 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
js 数据类型判断的方法
Dec 03 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制作静态网站的模板框架
2006/10/09 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
小程序如何写动态标签的实现方法
2020/02/05 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
基于python实现微信模板消息
2015/12/21 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
用Python解决x的n次方问题
2019/02/08 Python
Python中函数参数匹配模型详解
2019/06/09 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
找到不普通的东西:Bonanza
2016/10/20 全球购物
银行优秀员工事迹材料
2014/05/29 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
怎样写辞职信
2015/02/27 职场文书
党员读书活动心得体会
2016/01/14 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Python实现聚类K-means算法详解
2022/07/15 Python