博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习前端路由和vue-router笔记
阅读量:5746 次
发布时间:2019-06-18

本文共 2264 字,大约阅读时间需要 7 分钟。

前端路由原理本质就是监听 URL的变化,然后匹配路由规则,显示相应的页面,并且无须刷新。目前单页面使用的路由就只有两种实现方式

  • hash
  • history www.test.com/##/ 就是 Hash URL,当##后面的哈希值发生变化时,不会向服务器请求数据,可以通过 hashchange 事件来监听到URL 的变化,从而进行跳转页面。

vue-router hash实现源码(完整源码访问https://github.com/vuejs/vue-router/blob/dev/src/history/hash.js#L22-L54):

/** * 添加 url hash 变化的监听器 */setupListeners () {  const router = this.router  /**   * 每当 hash 变化时就解析路径   * 匹配路由   */  window.addEventListener('hashchange', () => {    const current = this.current    /**     * transitionTo:      * 匹配路由     * 并通过路由配置,把新的页面 render 到 ui-view 的节点     */    this.transitionTo(getHash(), route => {      replaceHash(route.fullPath)    })  })}复制代码

检测到 hash的变化后,就可以通过替换DOM的方式来实现页面的更换。

History模式是 HTML5 新推出的功能,比之 Hash URL 更加美观

两个APIpushStatereplaceState可以改变 url 地址且不会发送请求,还有onpopState事件。但因为没有# 号,所以当用户刷新页面之类的操作时,浏览器还是会给服务器发送请求。为了避免出现这种情况,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面。具体可以访问官网:

vue-router history实现源码(完整源码访问https://github.com/vuejs/vue-router/blob/dev/src/history/html5.js)

export class HTML5History extends History {  constructor (router, base) {    super(router, base)    /**     * 原理还是跟 hash 实现一样     * 通过监听 popstate 事件     * 匹配路由,然后更新页面 DOM     */    window.addEventListener('popstate', e => {      const current = this.current      // Avoiding first `popstate` event dispatched in some browsers but first      // history route not updated since async guard at the same time.      const location = getLocation(this.base)      if (this.current === START && location === initLocation) {        return      }      this.transitionTo(location, route => {        if (supportsScroll) {          handleScroll(router, route, current, true)        }      })    })  }  go (n) {    window.history.go(n)  }  push (location, onComplete, onAbort) {    const { current: fromRoute } = this    this.transitionTo(location, route => {      // 使用 pushState 更新 url,不会导致浏览器发送请求,从而不会刷新页面      pushState(cleanPath(this.base + route.fullPath))      onComplete && onComplete(route)    }, onAbort)  }  replace (location, onComplete, onAbort) {    const { current: fromRoute } = this    this.transitionTo(location, route => {      // replaceState 跟 pushState 的区别在于,不会记录到历史栈      replaceState(cleanPath(this.base + route.fullPath))      onComplete && onComplete(route)    }, onAbort)  }}复制代码

转载地址:http://pjazx.baihongyu.com/

你可能感兴趣的文章
iOS 高性能异构滚动视图构建方案 —— LazyScrollView
查看>>
Java 重载、重写、构造函数详解
查看>>
【Best Practice】基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏
查看>>
【云栖大会】探索商业升级之路
查看>>
HybridDB实例新购指南
查看>>
C语言及程序设计提高例程-35 使用指针操作二维数组
查看>>
华大基因BGI Online的云计算实践
查看>>
深入理解自定义Annotation,实现ButterKnif小原理
查看>>
排序高级之交换排序_冒泡排序
查看>>
Cocos2d-x3.2 Ease加速度
查看>>
[EntLib]关于SR.Strings的使用办法[加了下载地址]
查看>>
中小型网站架构分析及优化
查看>>
写shell的事情
查看>>
负载均衡之Haproxy配置详解(及httpd配置)
查看>>
linux虚拟机拷贝之后联网出错
查看>>
Linux文件系统探索
查看>>
标准与扩展ACL 、 命名ACL 、 总结和答疑
查看>>
查找恶意的TOR中继节点
查看>>
MAVEN 属性定义与使用
查看>>
hadoop2.7.2 HA搭建
查看>>