休闲游戏

一文搞懂 Vue Router 的钩子函数和实战用法!

🌟一文搞懂 Vue Router 的钩子函数和实战用法!

收藏点赞关注不迷路!

Vue Router 是 Vue 项目的核心模块之一,控制着页面的切换与导航逻辑。但在开发过程中,很多同学对它的"导航守卫(钩子函数)"理解不够深入,常常问:

❓"beforeEach 和 beforeRouteEnter 有啥区别?"

❓"我应该在哪个钩子里判断权限?"

❓"数据要不要在路由进入前就加载好?"

今天这篇文章就带你一次性理清 Vue Router 的生命周期钩子,并结合实际场景讲清楚该用谁、怎么用、为什么这么用。

🧭一、什么是 Vue Router 的钩子函数?

钩子函数(也叫导航守卫)是 Vue Router 在路由跳转前后暴露给开发者的生命周期函数,类似组件的 created、mounted,用于在特定阶段执行逻辑。

按照触发位置,我们可以将其分为三类:

类型

注册位置

示例函数

用途

全局守卫

router 实例

beforeEach、afterEach

全局登录验证、加载动画

路由独享守卫

单个路由

beforeEnter

单页权限控制

组件内守卫

组件内部

beforeRouteEnter 等

组件级数据初始化、退出确认

🔍二、全局导航守卫(最常用)

1️⃣ router.beforeEach

在每次路由切换前 触发,常用于登录验证、页面权限判断等逻辑。

ts

复制代码

// main.ts

router.beforeEach((to, from, next) => {

const isLoggedIn = Boolean(localStorage.getItem('token'))

if (to.meta.requiresAuth && !isLoggedIn) {

next('/login') // 未登录,跳转登录页

} else {

next() // 放行

}

})

✅ 实战场景:

判断用户是否登录

验证是否有权限访问某些页面(通过 to.meta.role)

显示加载动画(例如 NProgress)

2️⃣ router.afterEach

在每次路由跳转成功后触发,无法中断导航。

ts

复制代码

router.afterEach((to, from) => {

document.title = to.meta.title || '默认标题'

NProgress.done()

})

✅ 实战场景:

修改页面标题

结束 loading 动画

页面打点统计

🧩三、路由独享守卫(针对某个路由)

3️⃣ beforeEnter

写在路由配置中,只在进入该路由时触发。

ts

复制代码

{

path: '/admin',

component: AdminPage,

beforeEnter: (to, from, next) => {

const isAdmin = getUserRole() === 'admin'

if (isAdmin) next()

else next('/403')

}

}

✅ 实战场景:

控制某个页面的访问权限(如管理员后台)

页面首次进入时检查数据或状态

🧬四、组件内守卫(细粒度控制)

组件内钩子更接近"组件生命周期",和 Vue 的组件保持一致风格。

4️⃣ beforeRouteEnter

在组件创建之前 调用,此时组件实例还没被创建,不能访问 this,但可以通过回调拿到实例。

ts

复制代码

beforeRouteEnter(to, from, next) {

next(vm => {

vm.fetchData() // 组件已创建,安全访问 this

})

}

✅ 场景:在页面进入时就要调用接口初始化数据。

5️⃣ beforeRouteUpdate

在当前组件被复用,但参数变了 时触发(如 /user/1 → /user/2)。

ts

复制代码

beforeRouteUpdate(to, from, next) {

this.userId = to.params.id

this.fetchUserDetail()

next()

}

✅ 场景:用户详情页参数切换但不销毁组件时更新数据。

6️⃣ beforeRouteLeave

离开当前路由前触发,可用于阻止页面跳转(如填写表单时提醒用户)。

ts

复制代码

beforeRouteLeave(to, from, next) {

if (this.isFormDirty) {

const answer = window.confirm('表单未保存,确定离开?')

if (answer) next()

else next(false)

} else {

next()

}

}

✅ 场景:表单防丢失、离开提醒弹窗

🚀五、开发中的实际应用场景大全

应用场景

推荐钩子

说明

登录验证

beforeEach

全局校验,无需重复写

页面权限控制

beforeEach + to.meta.role

结合用户角色判断

动态标题设置

afterEach

修改 document.title

管理后台限制

beforeEnter

针对单个页面,清晰明了

页面初始化请求

beforeRouteEnter

路由刚进入时就发请求

参数变更刷新

beforeRouteUpdate

params 变化时重新加载内容

离开前提醒

beforeRouteLeave

表单编辑页的经典用法

加载动画控制

beforeEach + afterEach

与 NProgress 等配合

🎯六、总结:玩转导航钩子让路由更智能

Vue Router 的钩子函数,就像是给路由加上的"生命周期",让我们可以灵活地控制每一次导航行为。不管是登录验证、权限控制、数据初始化、页面离开确认,都能找到合适的钩子来实现。

🔑 记住这个使用顺序:

scss

复制代码

beforeEach (全局前置守卫)

→ beforeEnter (路由独享守卫)

→ beforeRouteEnter (组件进入)

→ beforeRouteUpdate (复用时更新)

→ beforeRouteLeave (离开前提示)

→ afterEach (全局后置守卫)

✅最后说一句

如果你看到这里,说明你已经掌握了 Vue Router 钩子的核心技能!别忘了 点赞 + 收藏 + 关注 一波 🧡,让我有动力继续写下去!

下篇文章我们可以聊聊:

🧩 如何用 Vue Router + 动态路由实现角色权限控制系统?

欢迎留言或者私信我你感兴趣的主题,我来帮你写出来!📘