路由守卫都有哪些以及都做过哪些事情,三个参数分别是干什么的
在使用 Angular 开发应用时,路由守卫是一个非常重要的概念。路由守卫可以帮助我们实现一些安全性和权限控制方面的功能,使得我们的应用更加稳定、安全和可靠。本文将介绍路由守卫的种类,以及它们都做过哪些事情,同时还会详细讲解每个守卫的三个参数分别是干什么的。
一、路由守卫的种类
在 Angular 中,路由守卫有四种种类,它们分别是:
CanActivate
:用于检查用户是否具有进入某个路由的权限。CanActivateChild
:用于检查用户是否具有进入子路由的权限。CanDeactivate
:用于检查用户是否可以离开当前路由。Resolve
:用于在路由激活之前获取异步数据。
二、路由守卫都做过哪些事情
1. CanActivate
CanActivate
守卫用于检查用户是否有进入某个路由的权限。当用户试图进入一个受保护的路由时,Angular 会执行 CanActivate
方法。如果该方法返回 true
,则用户将被允许进入该路由。如果该方法返回 false
,则用户将被重定向到其他页面或者显示一个错误信息。
CanActivate
守卫常用于检查用户登录状态或者权限等信息,例如:
- 检查用户是否已经登录,如果没有登录,则跳转到登录页面。
- 检查用户的角色是否具有权限,如果没有权限,则跳转到其他页面或者显示一个错误信息。
2. CanActivateChild
CanActivateChild
守卫用于检查用户是否有进入某个子路由的权限。当用户试图进入一个受保护的子路由时,Angular 会执行 CanActivateChild
方法。如果该方法返回 true
,则用户将被允许进入该子路由。如果该方法返回 false
,则用户将被重定向到其他页面或者显示一个错误信息。
CanActivateChild
守卫常用于检查用户登录状态或者权限等信息,例如:
- 检查用户是否已经登录,如果没有登录,则跳转到登录页面。
- 检查用户的角色是否具有权限,如果没有权限,则跳转到其他页面或者显示一个错误信息。
3. CanDeactivate
CanDeactivate
守卫用于检查用户是否可以离开当前路由。当用户试图离开当前路由时(例如点击浏览器后退按钮、导航到其他路由等),Angular 会执行 CanDeactivate
方法。如果该方法返回 true
,则用户将被允许离开当前路由。如果该方法返回 false
,则用户将不能离开当前路由。
CanDeactivate
守卫常用于检查表单是否已经保存,如果表单未保存,则提示用户是否保存数据。
4. Resolve
Resolve
守卫用于在路由激活之前获取异步数据,并在路由激活后传递给组件。当用户进入一个带有 resolve
的路由时,Angular 会执行 resolve
方法获取异步数据。如果获取数据成功,则用户将被允许进入该路由并且数据会被传递给组件。如果获取数据失败,则用户将被重定向到其他页面或者显示一个错误信息。
Resolve
守卫常用于获取一些必要的数据,例如:
- 获取用户信息,用于在用户进入某个页面时展示用户信息。
- 获取产品列表,用于在用户进入某个页面时展示产品列表。
三、每个守卫的三个参数分别是干什么的
无论哪种路由守卫,都有三个参数,它们分别是:
route
:表示当前要进入的路由。state
:表示当前应用的状态。routerState
:表示当前路由器的状态。
下面分别介绍每个参数的作用。
1. route
route
参数表示当前要进入的路由。我们可以通过该参数获取路由的各种信息,例如路由的路径、数据等。以下是一些常用的 route
属性:
route.path
:表示当前路由的路径。route.data
:表示当前路由的数据。route.params
:表示当前路由的参数。
举个例子,假设我们有一个路由配置如下:
typescript复制代码
{
path: 'product/:id',
component: ProductComponent,
data: {
title: 'Product details'
}
}
当用户进入 /product/123
路径时,route
对象的属性值如下:
route.path
的值为product/:id
。route.data
的值为{ title: 'Product details' }
。route.params
的值为{ id: '123' }
。
我们可以利用这些属性值做一些权限控制和数据获取等操作。
2. state
state
参数表示当前应用的状态。我们可以通过该参数获取应用的各种信息,例如应用的 URL、路由是否懒加载等。以下是一些常用的 state
属性:
state.url
:表示当前应用的 URL。state.root
:表示当前应用的根路由。state.children
:表示当前路由下的子路由。
举个例子,假设我们有一个路由配置如下:
typescript复制代码
{
path: '',
component: HomeComponent,
children: [
{
path: 'product',
loadChildren: () => import('./product/product.module').then(m => m.ProductModule)
}
]
}
当用户进入 /product
路径时,state
对象的属性值如下:
state.url
的值为/product
。state.root
的值为根路由。state.children
的值为{ path: 'product', loadChildren: ... }
。
我们可以利用这些属性值做一些权限控制和数据获取等操作。
3. routerState
routerState
参数表示当前路由器的状态。我们可以通过该参数获取路由器的各种信息,例如路由器中已经激活的路由、路由器中还未激活的路由等。以下是一些常用的 routerState
属性:
routerState.snapshot.url
:表示当前路由器的 URL。routerState.snapshot.root
:表示当前路由器的根路由。routerState.snapshot.children
:表示当前路由器中的子路由。
举个例子,假设我们有一个路由配置如下:
typescript复制代码
{
path: '',
component: HomeComponent,
children: [
{
path: 'product',
loadChildren: () => import('./product/product.module').then(m => m.ProductModule)
}
]
}
当用户进入 /product
路径时,routerState
对象的属性值如下:
routerState.snapshot.url
的值为/product
。routerState.snapshot.root
的值为根路由。routerState.snapshot.children
的值为{ path: 'product', loadChildren: ... }
。
我们可以利用这些属性值做一些权限控制和数据获取等操作。
四、总结
本文介绍了 Angular 中路由守卫的种类、每个守卫都做过哪些事情,以及每个守卫的三个参数分别是干什么的。路由守卫是 Angular 中非常重要的一个概念,通过使用路由守卫,我们可以实现一些安全性和权限控制方面的功能,使得应用更加稳定、安全和可靠。在开发应用时,我们需要根据需求选择不同的路由守卫,并合理利用每个守卫的三个参数,以实现更加灵活和强大的功能。