vuejs全局路由守卫和组件内守卫的基础使用

本文详细介绍VueJS中导航守卫的使用方法,包括安装vue-router、全局与组件内使用场景,通过实例演示如何实现基于token的登录验证。

1、安装vue-router

npm install vue-router

2、在需要使用组件引入

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

接下来就可以开始一些基础的使用啦~

3、全局使用场景

一般来说,想要进入某个网站或者系统的个人中心页面都是需要用户先进行登录操作的,我们暂时先用这个来举个小例子吧!这里用token来验证是否登录

// router文件
// index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from 'components/Index/index.vue'
import Center from 'components/Login/index.vue'
import Detail from 'components/Index/detail.vue'
// 根据自己的项目需要引入文件
Vue.use(VueRouter)
export default new vueRouter({
  routes: [{
    path: '/',
    component: Index
  }, {
    path: '/Detail',
    component: Detail,
    meta: {
      requireLogin: 2
    }
  }, {
    path: '/Center',
    component: Center,
    meta: {
      requireLogin: 1
    }
  }]
})

一般来说,想要进入某个网站或者系统的个人中心页面都是需要用户先进行登录操作的,我们暂时先用这个来举个小例子吧!这里用token来验证是否登录

// main.js
// 全局路由守卫
// 这是你书写所需要的路由的文件路径,把它引过来
import router from './router'
router.beforeEach((to, from, next) => {
  // 这个token是存储在localStorage
  let token = window.localStorage.getItem('token')
  if (to.meta.requireLogin && to.meta.requireLogin === 1) {
	if (token) {
	  next()
	} else {
	  next('/')
	}
  } else if (to.meta.requireLogin && to.meta.requireLogin === 2) {
     if (token) {
       next('/center')
     } else {
       next()
     }
  } else {
  	next()
  }
})

**meta是路由元信息

4、组件内使用场景

依然依赖上面的router文件

// js部分
// 随便你写点啥,头尾就先省略吧~
<script>
export default {
  data () {
    return {
      // 内容就省啦~重点往下看
    }
  },
  beforeRouteEnter: (to, from, next) => {
    // 组件内守卫
    next(vm => {
      // judge login
      let token = window.localStorage.getItem('token')
      if (to.meta.requireLogin && to.meta.requireLogin === 1) {
        if (token) {
          next()
        } else {
        // 不满足条件就要去进行登录操作
          next('/login')
        }
      } else if (to.meta.requireLogin && to.meta.requireLogin === 2) {
        if (token) {
          next('/')
        } else {
          next()
        }
      } else {
        next()
      }
    })
  }
}
</script>

emmmm,暂时就先来这两个吧~其他的后面有空了再加上来。
有不妥之处,大佬有更好的代码优化建议希望大佬不吝告知。不喜勿喷~

在 Vue 3 中,路由守卫的执行顺序是固定的,这有助于开发者更好地控制路由跳转逻辑。具体的执行顺序如下: 1. **全局前置守卫 `router.beforeEach`**:这是最先执行的守卫,在每次路由跳转前都会触发。可以用于全局的权限验证、登录状态检查等操作。 ```javascript import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes }); router.beforeEach((to, from, next) => { // 全局权限验证逻辑 next(); }); ``` 2. **路由独享守卫 `beforeEnter`**:如果当前路由配置了 `beforeEnter` 守卫,会在全局前置守卫之后执行。用于特定路由的个性化逻辑处理。 ```javascript const routes = [ { path: '/dashboard', component: Dashboard, beforeEnter: (to, from, next) => { // 特定路由的逻辑 next(); } } ]; ``` 3. **组件内的 `onBeforeRouteUpdate`(如果路由更新时组件被复用)**:当路由发生变化但组件被复用时,会触发该守卫。 ```vue <template> <div>Component</div> </template> <script setup> import { onBeforeRouteUpdate } from 'vue-router'; onBeforeRouteUpdate((to, from) => { // 组件复用且路由更新时的逻辑 }); </script> ``` 4. **全局解析守卫 `router.beforeResolve`**:在导航被确认之前,同时在所有组件内守卫异步路由组件被解析之后调用。 ```javascript router.beforeResolve((to, from, next) => { // 全局解析逻辑 next(); }); ``` 5. **组件内的 `onBeforeRouteEnter`**:在渲染该组件的对应路由被确认前调用。此时组件实例还未创建,若要访问组件实例,需要在 `next` 回调中进行。 ```vue <template> <div>Component</div> </template> <script setup> import { onBeforeRouteEnter } from 'vue-router'; onBeforeRouteEnter((to, from, next) => { next(vm => { // 通过 vm 访问组件实例 }); }); </script> ``` 6. **全局后置钩子 `router.afterEach`**:在导航确认之后调用,不接受 `next` 函数,主要用于一些全局的后置操作,如页面滚动处理、日志记录等。 ```javascript router.afterEach((to, from) => { // 全局后置操作 }); ``` 7. **组件内的 `onBeforeRouteLeave`**:在导航离开该组件的对应路由时调用,可用于处理未保存的数据提示等逻辑。 ```vue <template> <div>Component</div> </template> <script setup> import { onBeforeRouteLeave } from 'vue-router'; onBeforeRouteLeave((to, from) => { // 离开组件时的逻辑 }); </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值