✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3
文章目录
- 引言
- 一、Vue 3 路由概述
- 1.1 路由的简介
- 1.2 路由的分类
- 1.3 路由的语法
- 二、Vue 3 基本路由
- 2.1 基本路由的简介
- 2.2 基本路由的语法
- 2.3 基本路由的应用场景
- 三、Vue 3 命名路由
- 3.1 命名路由的简介
- 3.2 命名路由的语法
- 3.3 命名路由的应用场景
- 四、Vue 3 路由守卫
- 4.1 路由守卫的简介
- 4.2 路由守卫的语法
- 4.3 路由守卫的应用场景
- 5.1 路由参数的简介
- 5.2 路由参数的语法
- 5.3 路由参数的应用场景
- 六、Vue 3 动态路由
- 6.1 动态路由的简介
- 6.2 动态路由的语法
- 6.3 动态路由的应用场景
- 七、Vue 3 路由嵌套
- 7.1 路由嵌套的简介
- 7.2 路由嵌套的语法
- 7.3 路由嵌套的应用场景
- 八、Vue 3 路由缓存
- 8.1 路由缓存的简介
- 8.2 路由缓存的语法
- 8.3 路由缓存的应用场景
- 8.3.1 减少路由切换的开销
- 8.3.2 缓存静态资源
- 8.3.3 减少重定向的开销
- 九、Vue 3 路由中的计算属性和监听器
- 9.1 路由中的计算属性和监听器
- 9.2 路由中的计算属性和监听器的语法
- 9.3 路由中的计算属性和监听器的应用场景
- 十、Vue 3 路由的常见问题及解决方案
- 10.1 路由导航守卫问题
- 10.2 路由参数传递问题
- 10.3 路由缓存问题
引言
当今 Web 开发中,Vue 3 已经成为了一个备受欢迎的前端框架。在 Vue 3 中,路由是一个非常关键的组件,它可以帮助我们管理应用程序中的页面切换。今天将详细介绍 Vue 3 路由的方方面面,包括基本路由、命名路由、路由守卫、路由参数、动态路由、路由嵌套、路由缓存以及计算属性和监听器。
一、Vue 3 路由概述
1.1 路由的简介
路由是 Vue 3 中用于管理页面切换的核心组件。它可以帮助我们定义应用程序中的页面切换,并通过使用$route
和$routeParams
对象来访问当前路由和路由参数。
1.2 路由的分类
Vue 3 中的路由可以分为以下两种类型:
- 基本路由:基本路由是最基本的路由类型,它只包含一个路由参数对象,并且没有守卫函数。
- 命名路由:命名路由是一种通过名称来定义路由的类型。它可以包含多个路由参数,并且可以使用命名路由来进行嵌套。
1.3 路由的语法
在 Vue 3 中,定义路由可以使用“”组件来创建基本路由,也可以使用“”组件来创建命名路由。下面是一个基本路由的定义示例:
<template>
<div>
<a @click="goBack">返回</a>
<router-link to="/home">首页</router-link>
<router-link to="/about">关于我们</router-link>
</div>
</template>
在上面的示例中,我们使用“”组件来创建三个基本路由,分别是“/home”、“/about”和“/”。它们分别对应了应用程序中的三个页面。
除了基本路由之外,Vue 3 还支持命名路由。命名路由使用“”组件来创建,并且需要使用“”组件来渲染。下面是一个命名路由的定义示例:
<template>
<div>
<a @click="goBack">返回</a>
<router-view name="home"></router-view>
<router-view name="about"></router-view>
</div>
</template>
在上面的示例中,我们使用“”组件来渲染命名路由。命名路由使用“name”属性来定义,例如“home”和“about”分别对应了应用程序中的两个页面。
二、Vue 3 基本路由
2.1 基本路由的简介
基本路由是 Vue 3 中最基本的路由类型,它只包含一个路由参数对象,并且没有守卫函数。在 Vue 3 中,我们可以通过使用“”组件来创建基本路由。
2.2 基本路由的语法
创建基本路由可以使用“”组件,它支持以下两种语法:
- 直接链接语法:使用“to”属性来指定路由链接,例如“/home”。
- 命名路由语法:使用“to”属性来指定命名路由链接,例如“/home/index”。
下面是一个使用直接链接语法创建的基本路由示例:
<template>
<div>
<a @click="goBack">返回</a>
<router-link to="/home">首页</router-link>
<router-link to="/about">关于我们</router-link>
</div>
</template>
在上面的示例中,我们使用“”组件来创建两个基本路由,分别是“/home”和“/”。
2.3 基本路由的应用场景
基本路由适用于一些简单的页面,例如网站的首页、关于我们等页面。它没有守卫函数,因此不适用于需要对路由进行保护的情况。基本路由也不能包含多个路由参数,因此不适用于需要传递多个参数的情况。基本路由主要用于创建简单的链接,以便用户能够在页面之间进行导航。
三、Vue 3 命名路由
3.1 命名路由的简介
命名路由是一种通过名称来定义路由的类型。它可以包含多个路由参数,并且可以使用命名路由来进行嵌套。在 Vue 3 中,我们可以通过使用“”组件来创建命名路由。
命名路由可以用来组织和管理应用程序中的页面链接。例如,我们可以将页面名称作为命名路由,以便更好地组织和管理页面链接。此外,命名路由还可以用来实现页面级别的路由守卫,从而提高应用程序的安全性和可维护性。
3.2 命名路由的语法
创建命名路由可以使用“”组件,它支持以下两种语法:
- 直接链接语法:使用“to”属性来指定命名路由链接,例如“/home/index”。
<router-link to="/home/index">首页</router-link>
- 嵌套语法:使用“to”属性来指定命名路由的嵌套链接,例如“/home/index/edit”。
<router-link to="/home/index/edit">编辑首页</router-link>
3.3 命名路由的应用场景
命名路由的应用场景如下:
- 页面链接管理:
使用命名路由可以更好地组织和管理应用程序中的页面链接,以便开发人员更容易地维护和更新应用程序。
- 页面级别的路由守卫:
使用命名路由可以为每个页面定义独立的路由守卫,以提高应用程序的安全性和可维护性。
- 嵌套路由:
使用命名路由可以定义嵌套路由,以便更好地组织和管理页面链接。这在大型应用程序中尤为重要,因为它可以帮助开发人员更好地组织应用程序并减少混乱。
- 重定向:
使用命名路由可以定义重定向规则,以便在用户访问应用程序时将其重定向到特定的页面。这可以帮助开发人员更好地管理应用程序的用户流程和体验。
四、Vue 3 路由守卫
4.1 路由守卫的简介
路由守卫是 Vue 3 中用于保护路由的函数。它可以在路由切换时执行,并且在路由参数发生变化时可以进行相应的处理。
在 Vue 3 中,我们可以通过定义路由守卫来保护特定的路由,以防止非法用户访问。路由守卫可以使用 Vue 的守卫函数来实现,该函数接受两个参数:当前路由和路由参数。
4.2 路由守卫的语法
创建路由守卫可以使用 Vue 的守卫函数,该函数接受两个参数:当前路由和路由参数。守卫函数的语法如下:
export default {
beforeEnter(to, from, next) {
// 在这里编写守卫逻辑
}
}
其中,to 和 from 分别是当前路由和前一个路由,next 是路由守卫的回调函数。在路由守卫中,我们可以编写相应的逻辑来验证用户身份、处理非法请求等。
4.3 路由守卫的应用场景
路由守卫是 Vue 3 中非常实用的功能,它可以帮助我们实现页面级别的安全性和可维护性。以下是一些常见的应用场景:
- 用户登录验证:
在进入某些需要登录的路由前,可以通过路由守卫检查用户是否已经登录,如果没有登录,可以将用户重定向到登录页面。
- 权限验证:
在进入某些需要特定权限的路由前,可以通过路由守卫检查用户是否具有相应的权限,如果没有权限,可以将用户重定向到相应的提示页面。
- 数据加载:
在进入某些路由前,可以通过路由守卫进行数据加载,以确保数据已经加载完成后再进入路由。
- 埋点统计:
在路由切换时,可以通过路由守卫进行埋点统计,以便后续的数据分析。
- 页面缓存:
在路由切换时,可以通过路由守卫进行页面缓存,以提高页面加载速度。五、Vue 3 路由参数
5.1 路由参数的简介
Vue 3 中的路由参数指的是在路由路径中包含动态参数的一种方式。通过使用路由参数,可以在路由中传递数据和参数,以便动态地加载和渲染不同的组件和视图。例如,可以创建一个带有用户ID参数的路由,以便在加载用户详细信息视图时获取该用户的信息。
5.2 路由参数的语法
在 Vue 3 中,可以使用冒号语法在路由路径中定义动态参数。例如,以下路由定义了一个带有动态参数的路径:
const routes = [
{
path: '/user/:id',
name: 'User',
component: User,
}
]
在这个例子中,:id
表示一个动态参数,表示用户ID。这意味着当路由匹配到 /user/123
这个路径时,路由参数中的 id
将会被设置为 123
。
可以在路由组件中通过 $route.params
属性来访问路由参数。例如,在上面的例子中,可以使用以下代码来获取当前路由参数中的用户ID:
export default {
computed: {
userId() {
return this.$route.params.id;
},
},
}
5.3 路由参数的应用场景
路由参数的一个常见应用场景是在加载动态数据时使用。例如,在加载用户详细信息视图时,可以通过路由参数传递用户ID,并使用该ID从服务器获取用户数据。
另一个应用场景是在路由之间传递数据。例如,可以创建一个带有查询参数的路由,以便在不同的视图之间共享数据。
以下是一个完整的示例,演示如何使用路由参数来加载用户详细信息:
const routes = [
{
path: '/user/:id',
name: 'User',
component: User,
}
];
const router = createRouter({
history: createWebHistory(),
routes,
});
const User = {
data() {
return {
user: null,
};
},
created() {
const userId = this.$route.params.id;
this.fetchUser(userId);
},
methods: {
async fetchUser(userId) {
const response = await fetch(`/api/users/${userId}`);
const user = await response.json();
this.user = user;
},
},
template: `
<div>
<h1>{{ user.name }}</h1>
<p>{{ user.email }}</p>
</div>
`,
};
在这个示例中,我们定义了一个带有动态参数的路由 /user/:id
,并创建了一个名为 User
的组件来渲染用户详细信息。在 User
组件的 created
生命周期钩子中,我们通过 $route.params.id
来获取当前路由参数中的用户ID,并使用该ID从服务器获取用户数据。最后,我们将获取的用户数据渲染到模板中。
六、Vue 3 动态路由
6.1 动态路由的简介
动态路由是 Vue 3 中的一种路由类型,它可以在路由参数发生改变时动态地更新页面。在 Vue 3 中,我们可以通过定义动态路由来实现页面的动态更新。
动态路由可以使用 Vue 的 $route 对象和 $routeParams 对象来访问当前路由和路由参数。通过使用动态路由,我们可以实现页面的动态更新,例如在用户点击菜单时动态地更新页面。
6.2 动态路由的语法
创建动态路由可以使用 Vue 的 $route 对象和 $routeParams 对象,它们的语法如下:
export default {
name: 'DynamicRoute',
methods: {
goToDynamicRoute(routeName, routeParams) {
// 在这里编写动态路由逻辑
// Vue 的 $route 和 $routeParams 对象可以用来访问当前路由和路由参数
// 你可以在这里调用路由方法,比如:this.$router.push(routeName)
}
}
}
在上面的代码中,我们定义了一个名为 DynamicRoute
的动态路由。在方法 goToDynamicRoute
中,我们调用了 Vue 的$route
和 $routeParams
对象来访问当前路由和路由参数。然后,我们可以在这里调用路由方法,比如:this.$router.push(routeName)
来动态地更新页面。
6.3 动态路由的应用场景
动态路由可以用于实现多个具有相同页面结构但不同内容的页面,例如:
- 在电商网站上,当用户点击商品分类时,可以根据不同的分类动态地加载商品列表页面。
- 在新闻网站上,当用户点击不同的新闻分类时,可以根据不同的分类动态地加载新闻列表页面。
- 在博客网站上,当用户点击不同的博客分类或标签时,可以根据不同的分类或标签动态地加载博客列表页面。
七、Vue 3 路由嵌套
7.1 路由嵌套的简介
路由嵌套是 Vue 3 中的一种常用路由技术,它可以将多个路由组合在一起形成一个嵌套路由,从而实现页面的多层嵌套和复杂路由配置。
在路由嵌套中,我们可以将一个组件包含在另一个组件中,并将其作为子路由使用。这样,我们就可以在父组件中定义路由配置,并在子组件中显示路由内容。
7.2 路由嵌套的语法
在 Vue 3 中,我们可以使用以下语法来定义路由嵌套:
const routes = [
{
path: '/parent',
component: Parent,
children: [
{
path: 'child',
component: Child
}
]
}
]
在上面的代码中,我们定义了一个名为 “Parent” 的父组件和一个名为 “Child” 的子组件,并将它们组合在一起形成一个路由嵌套。在父组件中,我们使用了 “children” 属性来定义子路由,其中 “path” 属性指定了子路由的路径,“component” 属性指定了子路由所对应的组件。
7.3 路由嵌套的应用场景
路由嵌套可以用于实现复杂的页面结构和路由配置,例如:
- 在多级导航菜单中,可以通过路由嵌套实现多层嵌套和复杂的路由配置。
- 在电商网站上,可以通过路由嵌套实现商品分类、商品详情和购物车等功能的复杂路由配置。
- 在后台管理系统中,可以通过路由嵌套实现多个模块和子模块的复杂路由配置。
八、Vue 3 路由缓存
8.1 路由缓存的简介
Vue 3 中的路由缓存是一种机制,用于缓存路由映射,从而提高应用程序的性能和响应速度。当应用程序在不同路由之间切换时,Vue 3 会自动检查当前路由是否已经被缓存,如果是,则直接使用缓存中的值,而不是重新创建新的路由映射。这样可以大大减少应用程序的开销,从而提高性能和响应速度。
8.2 路由缓存的语法
Vue 3 中的路由缓存使用 router.cache
方法来创建和存储路由映射。该方法接受一个函数作为参数,该函数接受两个参数:当前路由和导航函数。返回一个缓存对象,该对象包含当前路由的映射。
例如,以下代码段演示了如何使用 router.cache
方法来缓存路由映射:
import { createPath } from 'vue-router';
export default {
path: createPath('/home'),
name: 'Home',
component: () => import('@/views/home/home.vue')
}
const homeCache = await Vue.cache.load('home');
export default {
path: '/home',
name: 'Home',
component: () => import('@/views/home/home.vue'),
meta: {
cached: homeCache
}
}
在上面的示例中,router.cache.load
方法用于从缓存中加载路由映射。meta: { cached: homeCache }
配置项用于将路由映射缓存到导航函数中。这样,每次导航到 /home
路由时,Vue 3 都会检查缓存中是否包含该路由映射,如果是,则直接使用缓存中的值,而不是重新创建路由映射。
8.3 路由缓存的应用场景
Vue 3 中的路由缓存可以用于许多场景,包括:
8.3.1 减少路由切换的开销
当应用程序中的路由映射非常多时,每次切换路由时,Vue 3 都需要重新创建新的路由映射,这会导致性能下降。使用路由缓存可以大大减少路由切换的开销,从而提高性能和响应速度。
8.3.2 缓存静态资源
当应用程序需要加载大量的静态资源 (例如图片、CSS 和 JavaScript 文件) 时,使用路由缓存可以显著提高应用程序的性能和响应速度。每次加载静态资源时,Vue 3 都会检查缓存中是否包含该资源,如果是,则直接从缓存中读取,而不是重新下载资源。
8.3.3 减少重定向的开销
当应用程序需要进行重定向时,例如从 /home
重定向到 /about
,Vue 3 需要重新创建新的路由映射。使用路由缓存可以大大减少重定向的开销,从而提高性能和响应速度。
九、Vue 3 路由中的计算属性和监听器
9.1 路由中的计算属性和监听器
路由中的计算属性用于管理路由参数。例如,如果应用程序中的路由是 /user/:id
,可以使用计算属性来管理 id
参数。计算属性的语法如下:
export default {
computed: {
userId() {
return this.$route.params.id;
}
}
}
在上面的示例中,userId
计算属性返回路由参数 id
的值。每当路由参数发生变化时,计算属性都会重新计算并返回新的值。
9.2 路由中的计算属性和监听器的语法
路由中的监听器用于管理路由导航事件。例如,如果应用程序中的路由是 /user/:id
,可以使用监听器来监听路由导航事件。监听器的语法如下:
import { createPath } from 'vue-router';
export default {
name: 'UserList',
path: createPath('/user'),
component: () => import('@/views/user/list.vue'),
beforeEnter(to, from, next) {
// 创建监听器,用于监听路由导航事件
const watch = {
transition: (to, from) => {
// 监听路由导航事件,用于更新用户 ID 的值
this.updateUserList();
}
};
// 注册监听器
this.$router.push(to);
// 进入路由导航前,触发一次更新用户列表的操作
next();
},
// 进入路由导航后,触发一次更新用户列表的操作
beforeExit(to, from, next) {
// 清除监听器
this.$router.push(to);
}
}
在上面的示例中,beforeEnter
方法创建了一个监听器,用于监听路由导航事件。transition
属性用于更新用户列表,this.updateUserList
方法用于更新用户列表。每当路由导航时,updateUserList
方法都会重新计算用户列表,并重新渲染视图。
9.3 路由中的计算属性和监听器的应用场景
计算属性和监听器可以用于管理路由参数和路由导航事件。例如,如果应用程序中的路由是 /user/:id
,可以使用计算属性来管理 id
参数,并使用监听器来管理路由导航事件。当用户点击导航按钮时,可以触发一个事件,用于更新计算属性和监听器,以更新用户列表。
另外,计算属性和监听器也可以用于管理其他状态,例如在用户登录时,可以使用计算属性来管理用户 ID 和权限信息,并使用监听器来管理用户登录后的状态。这样,应用程序可以更好地管理状态,并提高应用程序的性能和响应速度。
十、Vue 3 路由的常见问题及解决方案
10.1 路由导航守卫问题
问题描述:路由导航守卫无法正常执行或执行顺序不符合预期。
解决方案:检查路由守卫的定义和注册是否正确。在定义路由守卫时,需要按照 Vue 3 中的守卫函数命名方式进行命名,并将其注册到路由器实例中。另外,需要注意路由守卫的执行顺序,包括全局守卫和路由独享守卫的执行顺序。
10.2 路由参数传递问题
问题描述:路由参数传递失败,无法在组件中获取到路由参数。
解决方案:检查路由参数的定义和使用方式。在定义路由时,需要将路由参数定义在路由路径中,并使用“:”
符号进行标识。在组件中获取路由参数时,需要使用$route.params对象
进行获取,例如this.$route.params.id
。
10.3 路由缓存问题
问题描述:路由缓存导致组件无法正常更新。
解决方案:可以通过在路由配置中添加“meta”属性,来控制组件的缓存行为。例如,可以在需要缓存的路由中添加“meta:{keepAlive:true}”,来启用路由缓存功能。另外,也可以通过在路由切换时,手动清除组件的缓存数据来解决路由缓存问题。