锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 前端
  4. vue2路由和vue3路由区别及原理

vue2路由和vue3路由区别及原理

0
  • 前端
  • 发布于 2024-10-08
  • 4 次阅读
黄健
黄健

一、Vue2 与 Vue3 路由的区别

1. 创建路由实例方式的不同

  • Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。

    import Vue from 'vue';import VueRouter from 'vue-router';import Home from '@/components/Home.vue';​Vue.use(VueRouter);​const routes = [ { path: '/', component: Home }];​const router = new VueRouter({

    routes});​new Vue({
    router,  render: h => h(App)}).$mount('#app');​
    

Vue 3 中,通过 createRouter 和 createWebHistory 等 API 创建路由实例,直接使用 app.use() 挂载,不再需要 Vue.use() 来注册插件。

import { createApp } from 'vue';import { createRouter, createWebHistory } from 'vue-router';import Home from '@/components/Home.vue';import App from './App.vue';​const routes = [  { path: '/', component: Home }];​const router = createRouter({
    history: createWebHistory(),  routes});​const app = createApp(App);app.use(router);app.mount('#app');​

2. 动态路由的添加方式

  • Vue 2 中使用 addRoutes() 来动态添加多个路由,这个方法已经在 Vue 3 中被移除。

    router.addRoutes([ { path: '/about', component: About }]);​

Vue 3 中使用 addRoute() 来动态添加单个路由,且可以指定父级路由进行嵌套路由的动态添加。

router.addRoute({ path: '/about', component: About });router.addRoute('parent', { path: 'child', component: Child });​

3. 路由守卫的变化

Vue 3 在组合式 API (setup) 中新增了 onBeforeRouteUpdate 和 onBeforeRouteLeave 这两个钩子,可以直接在 setup 中使用,而不再依赖组件选项(Options API)。

  • Vue 2 中,路由守卫在组件选项中定义。

    export default {

    beforeRouteEnter(to, from, next) {
      // 在进入组件前调用    next();  },  beforeRouteUpdate(to, from, next) {
      // 路由更新时调用    next();  },  beforeRouteLeave(to, from, next) {
      // 离开组件时调用    next();  }};​
    

Vue 3 中,可以在 setup 中直接使用 onBeforeRouteUpdate 和 onBeforeRouteLeave。

import { onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';​export default {
    setup() {
      onBeforeRouteLeave((to, from) => {
        // 路由离开时触发的守卫    });​    onBeforeRouteUpdate((to, from) => {
        // 路由更新时触发的守卫    });  }};​

4. 组合式 API 的支持

Vue 3 使用了 useRouter 和 useRoute 这两个 Composition API,能够在 setup 中方便地访问路由实例和路由信息。这在 Vue 2 中是无法做到的,因为 Vue 2 的 vue-router 与 Options API 深度耦合。

import { useRouter, useRoute } from 'vue-router';​export default {
    setup() {
      const router = useRouter();    const route = useRoute();​    const goToHome = () => {
        router.push({ name: 'Home' });    };​    return { goToHome, route };  }};​

5. 路由模式的选择

  • Vue 2 中,使用 mode 参数来决定使用 history 还是 hash 模式。

    const router = new VueRouter({

    mode: 'history',  // 或者 'hash'  routes});​
    

Vue 3 中,使用 createWebHistory() 或 createWebHashHistory() 明确区分路由模式。

const router = createRouter({
    history: createWebHistory(),  // 或者 createWebHashHistory()  routes});​

6. 其他差异

  • 更好的 TypeScript 支持 :Vue 3 和 vue-router@4 对 TypeScript 进行了优化,提供了完整的类型推断和类型检查。

  • 过渡效果改进 :Vue 3 的 <router-view> 支持新的 v-slot 用法来控制过渡效果。

二、Vue Router 的原理解析

1. 路由的核心原理

Vue Router 的核心原理就是通过 Hash 模式 或 History 模式 来监听 URL 的变化,从而实现视图组件的动态切换。

  1. Hash 模式 :通过监听 window.onhashchange 事件来感知 URL 中 # 后面内容的变化。

  2. History 模式 :基于 window.history.pushState 和 window.history.replaceState API 来修改 URL,并通过 popstate 事件监听 URL 的变化。

2. 路由匹配机制

Vue Router 的路由匹配基于路由表 (routes) 进行匹配。它使用了 path-to-regexp 库将 path 转换成正则表达式,并与当前 URL 进行比对,从而找到合适的路由。

  • 每个路由规则(RouteRecord)都包含 path、component 等信息。

  • 在匹配过程中,会将路由表中的每一个 RouteRecord 进行遍历,并基于路径解析进行比对。

  • 一旦找到匹配的路由规则,就会渲染对应的组件。

3. 导航守卫执行顺序

Vue Router 提供了三种导航守卫:全局守卫、路由独享守卫和组件内守卫。它们的执行顺序如下:

  1. 全局前置守卫 (beforeEach)

  2. 路由独享守卫 (beforeEnter)

  3. 组件内守卫 (beforeRouteEnter)

  4. 全局解析守卫 (beforeResolve)

  5. 全局后置守卫 (afterEach)

4. 路由切换过程

  • 路由解析 :在 router.push 或者 URL 变化时,路由会首先匹配路由表中符合条件的路由规则。

  • 执行导航守卫:依次执行全局、路由独享和组件内的导航守卫。

  • 更新视图 :在守卫全部通过后,更新组件树,重新渲染 router-view 视图。

三、总结

Vue 3 的 vue-router@4 相较于 Vue 2 更加现代化和灵活,并且对 TypeScript 进行了更好的支持。与此同时,Vue 3 的路由实现基于 Composition API,使其能够更好地与 Vue 3 的设计理念相契合,提升了开发体验和可维护性。


原文链接: https://blog.csdn.net/qq_25416827/article/details/142746748

标签: #VUE 61 #前端 145
相关文章

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

vue项目 部署到nginx 上刷新页面显示404 2024-09-30 17:34

在Vue项目部署到Nginx服务器上时,遇到刷新页面显示404的问题,通常是因为Nginx无法正确地处理Vue路由(尤其是单页面应用(SPA)中的前端路由)。Vue应用的路由是前端路由,依赖于JavaScript来动态解析URL,当直接访问除根路径外的URL时,Nginx默认会尝试在服务器上找到对应

三小时快速上手TypeScript,TS速通教程(上篇、中篇、下篇、附加篇) 2024-09-29 11:21

TypeScript速通 Typescript简介 为什么需要TypeScript * JavaScript今非昔比 JavaScript中的困扰 1. 不清不楚的数据类型 2. 有漏洞的逻辑 3. 访问不存在的属性 4. 低级的拼写错误 TypeScrip

js中的事件冒泡是什么? 2024-09-29 11:21

事件冒泡(Event Bubbling)是JavaScript中一种事件传播机制。当一个事件(如点击、键盘输入等)发生在某个元素上时,浏览器会首先触发该元素上的特定事件处理函数(如果存在的话)。然后,该事件会从当前元素向其父元素逐级传播,直到达到元素或整个文档树。这种从触发元素开始,逐级向上传播的事

Vue.js 的 Mixins 2024-09-26 17:57

Vue.js 的 Mixins 是一种非常强大且灵活的功能,它允许你封装可复用的 Vue 组件选项。Mixins 实际上是一种分发 Vue 组件可复用功能的非常灵活的方式。一个 mixin 对象可以包含任意组件选项。当组件使用 mixin 时,所有 mixin 选项将被"混入"该组件本身的选项。 M

前端框架对比和选择 2024-09-26 17:57

在前端开发的广阔领域中,框架的选择对于项目的成功至关重要。不同的框架各具特色,适用于不同的开发需求和项目规模。本文将对当前最流行的三大前端框架——React、Vue和Angular进行详细对比,并探讨如何根据项目需求选择合适的框架。 一、React 1. 简介 React是由Facebook开发和维

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.