组件导航守卫通常用于处理组件级别的特定逻辑。以下是一些常见的使用场景:
1、表单数据保存提醒:
| <template> |
| <div> |
| <form @submit.prevent="handleSubmit"> |
| <input v-model="formData.name" /> |
| |
| </form> |
| </div> |
| </template> |
| |
| <script> |
| export default { |
| data() { |
| return { |
| formData: { |
| name: '', |
| }, |
| isFormDirty: false |
| } |
| }, |
| |
| watch: { |
| formData: { |
| handler() { |
| this.isFormDirty = true |
| }, |
| deep: true |
| } |
| }, |
| |
| beforeRouteLeave(to, from, next) { |
| if (this.isFormDirty) { |
| const answer = window.confirm('表单未保存,确定要离开吗?') |
| if (answer) { |
| next() |
| } else { |
| next(false) |
| } |
| } else { |
| next() |
| } |
| } |
| } |
| </script> |
2、组件数据预加载:
| <script> |
| export default { |
| data() { |
| return { |
| pageData: null, |
| loading: true |
| } |
| }, |
| beforeRouteEnter(to, from, next) { |
| |
| fetchPageData(to.params.id) |
| .then(data => { |
| next(vm => { |
| vm.pageData = data |
| vm.loading = false |
| }) |
| }) |
| .catch(error => { |
| next(vm => { |
| vm.error = error |
| vm.loading = false |
| }) |
| }) |
| } |
| } |
| </script> |
3、记录/恢复滚动位置:
| <script> |
| export default { |
| data() { |
| return { |
| scrollPosition: 0 |
| } |
| }, |
| |
| beforeRouteLeave(to, from, next) { |
| this.scrollPosition = window.scrollY |
| localStorage.setItem('scrollPosition', this.scrollPosition) |
| next() |
| }, |
| |
| beforeRouteEnter(to, from, next) { |
| next(vm => { |
| const savedPosition = localStorage.getItem('scrollPosition') |
| if (savedPosition) { |
| window.scrollTo(0, parseInt(savedPosition)) |
| } |
| }) |
| } |
| } |
| </script> |
4、组件内参数变化处理:
| <script> |
| export default { |
| beforeRouteUpdate(to, from, next) { |
| |
| |
| this.userData = null |
| this.fetchUserData(to.params.id) |
| next() |
| }, |
| methods: { |
| fetchUserData(id) { |
| |
| } |
| } |
| } |
| </script> |
5、权限切换处理:
| <script> |
| export default { |
| beforeRouteUpdate(to, from, next) { |
| |
| if (to.meta.requiredRole && !this.hasRole(to.meta.requiredRole)) { |
| next({ name: 'unauthorized' }) |
| } else { |
| next() |
| } |
| }, |
| methods: { |
| hasRole(role) { |
| |
| } |
| } |
| } |
| </script> |
6、组件状态重置:
| <script> |
| export default { |
| data() { |
| return { |
| filters: {}, |
| sortBy: 'default', |
| currentPage: 1 |
| } |
| }, |
| beforeRouteLeave(to, from, next) { |
| |
| this.resetState() |
| next() |
| }, |
| methods: { |
| resetState() { |
| this.filters = {} |
| this.sortBy = 'default' |
| this.currentPage = 1 |
| } |
| } |
| } |
| </script> |
7、缓存控制:
| <script> |
| export default { |
| beforeRouteLeave(to, from, next) { |
| |
| if (to.meta.clearCache) { |
| this.$destroy() |
| this.$el.parentNode.removeChild(this.$el) |
| } |
| next() |
| } |
| } |
| </script> |
8、动画状态处理:
| <script> |
| export default { |
| beforeRouteEnter(to, from, next) { |
| next(vm => { |
| vm.startEntryAnimation() |
| }) |
| }, |
| beforeRouteLeave(to, from, next) { |
| |
| this.startExitAnimation().then(() => { |
| next() |
| }) |
| }, |
| methods: { |
| startEntryAnimation() { |
| |
| }, |
| startExitAnimation() { |
| |
| return new Promise(resolve => { |
| setTimeout(resolve, 500) |
| }) |
| } |
| } |
| } |
| </script> |
组件导航守卫主要用于:
- 处理组件特定的路由逻辑
- 表单处理和数据保存
- 组件状态管理
- 数据预加载
- 权限控制
- 动画处理
- 缓存控制
- 用户体验优化(如滚动位置)
而全局性的逻辑(如用户认证、全局权限等)则应该放在全局导航守卫中处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗