vue-router源码之history类的浅析

下面我会为你详细讲解“vue-router源码之history类的浅析”的完整攻略。

一、什么是 vue-router 的 history 类?

vue-router 提供了多种模式的路由实现,其中一种就是 history 模式。这种模式使用了 HTML5 提供的 History API,可以在不刷新页面的情况下改变浏览器的 URL。 vue-router 的 history 类实现了这种模式的具体逻辑。

二、history 类的基本结构

history 类主要包含了以下几个部分:

  1. 构造函数

用于初始化 history 实例,同时绑定 popstate 事件的监听器。

  1. 原型属性

history 实例的原型包含了 navigate、push、replace、go、back、forward 等方法,用于实现改变 URL 的具体逻辑。

  1. 监听器

history 类为 window 对象绑定了一个 popstate 事件的监听器,当用户通过前进或后退按钮改变 URL 时,会触发该监听器,然后根据不同的情况调用相应的方法。

三、history 类的具体实现

  1. 构造函数

history 类的构造函数主要做两件事情:

  • 绑定 popstate 事件的监听器,该监听器会在浏览器的历史记录栈发生变化时触发,然后根据不同的情况执行不同的操作;
  • 初始化 history 实例的各种属性,比如当前页面的路径、状态栈、变化前后的状态等等。
export class History {
  ...
  constructor(router, base) {
    this.router = router
    this.base = normalizeBase(base)
    ...
    window.addEventListener('popstate', e => {
      this.transitionTo(getLocation(this.base), route => {
        handlePopState(route)
      })
    })
    ...
  }
  ...
}
  1. navigate 方法

navigate 方法用于实现路由的跳转,它会调用 pushState 或 replaceState 方法改变浏览器的历史记录,并触发 popstate 事件,让监听器根据不同的情况执行不同的操作。

History.prototype.navigate = function (to, replace, fn) {
  ...
  const route = this.router.match(to, this.current)
  this.confirmTransition(route, () => {
    const prev = this.current
    this.updateRoute(route)
    fn && fn(route)
    this.ensureURL()
    this.router.afterHooks.forEach(hook => {
      hook && hook(route, prev)
    })
    if (!this.ready) {
      this.ready = true
      this.readyCbs.forEach(cb => { cb(route) })
    }
  })
}
  1. push 方法

push 方法调用 navigate 方法实现路由的跳转,并将操作类型设置为 push。

History.prototype.push = function (location, onComplete, onAbort) {
  this.transitionTo(location, route => {
    pushState(cleanPath(this.base + route.fullPath))
    onComplete && onComplete(route)
  }, onAbort)
}
  1. replace 方法

replace 方法调用 navigate 方法实现路由的跳转,并将操作类型设置为 replace。

History.prototype.replace = function (location, onComplete, onAbort) {
  this.transitionTo(location, route => {
    replaceState(cleanPath(this.base + route.fullPath))
    onComplete && onComplete(route)
  }, onAbort)
}
  1. ensureURL 方法

ensureURL 方法用于确保浏览器的实际 URL 与 history 实例中存储的 URL 一致。

History.prototype.ensureURL = function (push) {
  if (getLocation(this.base) !== this.current.fullPath) {
    const current = cleanPath(this.base + this.current.fullPath)
    push ? pushState(current) : replaceState(current)
  }
}

四、示例说明

下面我们使用两个示例说明 history 类的具体实现。

示例一:使用 push 方法跳转路由

router.push('/home')

调用 push 方法时,会先解析出 /home 对应的路由,然后调用 transitionTo 方法进行路由的切换,最后调用 pushState 方法改变浏览器的历史记录。路由的过渡动画等操作,都是在 transitionTo 方法内实现的。

示例二:通过前进或后退按钮改变 URL

当用户点击前进或后退按钮时,浏览器的历史记录栈会发生变化,此时会触发 popstate 事件,然后调用 history 类的监听器。监听器会根据变化前后的状态,调用 forward 或 back 方法实现路由的切换。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue-router源码之history类的浅析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue.js实现列表清单的操作方法

    针对”Vue.js实现列表清单的操作方法”,我会提出以下攻略步骤并提供两个相关的代码示例: 一、 定义列表项组件: 使用Vue.js,我们可以定义一个组件,用于渲染列表中的单个项。组件应该有两个props,一个用于接收数据数组,一个用于接收点击事件的回调函数,用于处理单击事件。该组件的代码示例如下: <template> <li v-for…

    Vue 2023年5月27日
    00
  • Vue.js实现可排序的表格组件功能示例

    当我们开发一些管理性质的网站时,表格是非常基本的需求。常见的表格功能有分页、排序、搜索等,其中销售额这类的表格,排序功能尤其重要。 Vue.js是一种渐进式JavaScript框架,具有轻量级、高效率、易上手等优点,因此成为了前端开发中的热门工具。下面介绍如何通过Vue.js实现可排序的表格组件功能示例。 第一步:拆分组件 首先将一个整体的表格组件拆分成多个…

    Vue 2023年5月29日
    00
  • 简单聊一聊axios配置请求头content-type

    当使用axios发送HTTP请求时,你可以在请求中添加headers头部来指定Content-Type类型。默认情况下,Content-Type类型为application/json。这意味着在发送axios请求时,如果我们的请求需要使用不同的Content-Type设置,我们需要进行额外的配置。 下面是一份通用的axios请求配置,可以让我们设置请求头的C…

    Vue 2023年5月28日
    00
  • vue-cli npm如何解决vue项目中缺失core-js的问题

    当我们创建一个Vue项目时,通常会使用vue-cli来进行项目初始化和配置。但是,在某些情况下,会在编译或运行Vue应用程序期间遇到缺少“core-js”的错误。这时,我们可以使用npm来安装“core-js”,以解决这个问题。 下面是解决“vue-cli npm如何解决vue项目中缺失core-js的问题”的完整攻略: 步骤1:检查缺少“core-js”的…

    Vue 2023年5月28日
    00
  • Vue编译器解析compile源码解析

    Vue编译器是一个非常重要的组成部分,它的作用是将Vue组件中的template模板转化为渲染函数,以实现组件的动态渲染。本篇攻略将详细介绍Vue编译器解析compile源码的过程。 什么是compile源码? compile源码是Vue编译器的一部分,它是Vue的编译过程的核心部分。该部分主要负责将Vue组件的模板转化为渲染函数。 compile源码执行过…

    Vue 2023年5月27日
    00
  • 通过vue手动封装on、emit、off的代码详解

    下面就是“通过Vue手动封装on、emit、off的代码详解”的攻略。 什么是on、emit、off on、emit、off是Vue中的三个方法。其中,on用于监听自定义事件的回调函数,emit用于触发子组件中自定义事件,off用于移除事件监听器。 封装on、emit、off 在Vue框架中,我们不需要手动封装on、emit、off,可以直接在组件中使用这三…

    Vue 2023年5月27日
    00
  • vue的传参方式汇总和router使用技巧

    一、介绍 在Vue框架中,我们经常需要进行组件之间的传值,根据传参的方式不同,我们又可以将其分为props、$emit、vuex、router、cookie等等。其中,props与$emit的传参方式主要用于组件之间传值,其余的传参方式则主要用于组件之间以及前后端之间的数据交互。 在本篇文章中,我们将对vue的传参方式进行详细的汇总,同时也会涉及到route…

    Vue 2023年5月27日
    00
  • vue配置文件自动生成路由和菜单实例代码

    Vue项目中,通常需要配置路由和菜单,但手动编写路由配置和菜单项信息可能会比较繁琐和易错。因此,利用一些插件或工具可以自动生成路由和菜单是非常方便的。 下面是一份“vue配置文件自动生成路由和菜单实例代码”的完整攻略: 1. 准备工作 首先,我们需要在项目中安装必要的依赖: npm i vue-router routify –save 其中,vue-rou…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部