vue3路由(基本用法、路由守卫、动态路由)

目录

一、基本用法

1、字符串写法

2、对象写法

二、路由守卫

1、全局守卫

2、独享守卫beforeEnter

三、动态路由

1、配置静态路由

2、在全局路由守卫中设置跳转规则(未登录则跳转到登录页,已登录跳转到首页或放行)

3、在登录页中登录获取路由和用户信息后pinia存储用户信息并动态添加路由

4、退出登录后移除动态路由

5、防止浏览器刷新后出现404(因为刷新后相当于项目重新运行,添加的动态路由就没了)


官网:接口:Router | Vue Router

一、基本用法

注:这里只说编程式路由导航,(不说<router-link>,项目中基本不用,也没法写逻辑)

基础知识:useRoute 和 useRouter 的区别

useRoute用于在组件中获取当前路由的信息,返回一个包含路由信息的对象。这个函数适用于那些不需要监听路由变化的场景,只是获取当前路由信息的静态数据。

useRouter用于获取路由实例,可以通过它来进行一些动态的路由操作,比如跳转到新的路由。它返回一个包含路由实例的对象。其中包括当前路由信息。

1、字符串写法

push是追加历史记录,replace是替换当前记录

import { useRouter } from 'vue-router'
const router = useRouter()

const toHome = () => {
  router.push('/home')
}

const toAbout = () => {
  router.replace('/about')
}
2、对象写法

注意:query传参对象里面可以写name或者path,params传参对象里面匹配只能写name

// query传参
import { useRouter } from 'vue-router'
const router = useRouter()

const toHome = () => {
  router.push({
    path: '/home'
    query: {
      id: 1,
      title: '震惊,老婆饼里没老婆'
    }
  })
}


// 接收
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.query)
// params传参
import { useRouter } from 'vue-router'
const router = useRouter()


const toAbout = () => {
  router.replace({
    name: 'about',
    params: {
      id: 1,
      title: '震惊,老婆饼里没老婆'
    }
  })
}

// 接收
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.params)

// params传参需要路由表配合使用  ?代表可传可不传
{
   path: '/about/:id/:title?',
   name: 'about',
   component: () => import('../views/AboutView.vue')
}

二、路由守卫

分类:全局守卫、单个路由守卫、组件内部守卫

1、全局守卫

beforeEach()全局前置守卫:初始化时执行、每次路由切换前执行;

三个参数:

to:要跳转到的目标路由

from:从当前哪个路由进行跳转

next:不做任何阻拦,直接通行,该往哪个路由跳转就往哪个跳转

route中有一个配置项是meta,专门提供给我们,在meta项中配置自己的属性与值,可用于在守卫中的权限判断

//前置路由
import { userStore } from '../store/userInfo';
router.beforeEach((to, from, next) => {
    const store = userStore();
    //判断是否有权限返回登录界面
    if (from.meta.isAuth) {
        if (store.userInfo.token) {
            next()
        } else {
            next("/login")
        }
    } else {
        console.log("没有权限");
        next()
    }
})

全局后置路由守卫afterEach

对于分析、更改页面标题、声明页面等辅助功能都很有用

//后置路由
router.afterEach((to, from) => {
    console.log("全局后置路由守卫");
    //设置跳转路由后页面的标题
    document.title = to.meta.title as string
})
2、独享守卫beforeEnter

直接在需要设置权限的路由配置中写代码,代码逻辑和全局前置路由一模一样

.....
, {
        name: 'order',
        path: 'order',
        meta: { isAuth: true, title: '订单管理' },
        component: () => import("../components/page/Order.vue"),
        //独享守卫
        beforeEnter: (to: any, from: any, next: any) => {
            console.log("路由独享守卫beforeEnter");
            next()
        }
    }

三、动态路由

1、配置静态路由
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/login',
      name: 'login',
      component: LoginView
    }
  ]
})
2、在全局路由守卫中设置跳转规则(未登录则跳转到登录页,已登录跳转到首页或放行)
import { useUserInfoStore } from '@/stores/userInfo'
router.beforeEach((to: any, from: any, next: any) => {
  // 从pinia获取用户的登录状态
  const userInfo = useUserInfoStore() // 注意:这个取值只能写在函数里,不然报错,因为写在外面app.use(router)的时候就调用了,当时还没有加载到pinia
  if (userInfo.isLogin) {
    if (to.path === '/login') {
      next({
        path: '/home'
      })
    } else {
      next()
    }
  } else {
    if (to.path === '/login') {
      next()
    } else {
      next({
        path: '/login'
      })
    }
  }
})
3、在登录页中登录获取路由和用户信息后pinia存储用户信息并动态添加路由

pinia使用及持久化存储请访问:pinia使用方法-CSDN博客

//简单写的pinia存储登录状态
import { ref } from 'vue'
import { defineStore } from 'pinia'

export const useUserInfoStore = defineStore(
  'userInfo',
  () => {
    const isLogin = ref(false)
    function changeIsLogin(state: boolean) {
      isLogin.value = state
    }

    return { isLogin, changeIsLogin }
  },
  { persist: true }
)
import { useRouter } from 'vue-router'
import { useUserInfoStore } from '@/stores/userInfo'
const userInfo = useUserInfoStore()
const router = useRouter()
const login = () => {
  userInfo.changeIsLogin(true)
  // 这里是要追加的动态路由,这里随便写死的,按理说正常开发应该从后端返回,然后前端拿到后转成这样的数组存在pinia
  const routerArr = [
    {
      path: '/',
      redirect: '/home'
    },
    {
      path: '/home',
      name: 'home',
      component: HomeView
    },
    {
      path: '/:pathMatch(.*)', //必须写 (/:pathMatch(.*)* 可以匹配任意路径,包括根路径和子路径。)
      name: '404',
      component: NotFount
    },
    {
      path: '/about/:id?/:title?',
      name: 'about',
      component: () => import('../views/AboutView.vue')
    }
  ]
  routerArr.forEach((item) => {
    router.addRoute(item)
  })
  router.replace('/home')
}
4、退出登录后移除动态路由
const quit = () => {
  userInfo.changeIsLogin(false)
  // 这里是退出登录后要删除的路由,这里随便写死的,按理说正常开发应该从后端返回,然后前端拿到后转成这样的数组存在pinia
  const routerArr = ['home', '404', 'about']

  routerArr.forEach((item) => {
    router.removeRoute(item)
  })
  router.replace('/login')
}
5、防止浏览器刷新后出现404(因为刷新后相当于项目重新运行,添加的动态路由就没了)

这里做法是使用isReady方法,它返回一个 Promise,它会在路由器完成初始导航之后被解析,也就是说这时所有和初始路由有关联的异步入口钩子和异步组件都已经被解析。如果初始导航已经发生,则该 Promise 会被立刻解析。

当刷新页面后路由器初始化完成后如果用户已登录重新追加动态路由

router.isReady().then(() => {
  const userInfo = useUserInfoStore()
  if (userInfo.isLogin) {
    // 这里是要追加的动态路由,这里随便写死的,按理说正常开发应该从后端返回,然后前端拿到后转成这样的数组存在pinia
    const routerArr = [
      {
        path: '/',
        redirect: '/home'
      },
      {
        path: '/home',
        name: 'home',
        component: HomeView
      },
      {
        path: '/:pathMatch(.*)', //必须写 (/:pathMatch(.*)* 可以匹配任意路径,包括根路径和子路径。)
        name: '404',
        component: NotFount
      },
      {
        path: '/about/:id?/:title?',
        name: 'about',
        component: () => import('../views/AboutView.vue')
      }
    ]
    routerArr.forEach((item) => {
      router.addRoute(item)
    })

    router.replace(router.currentRoute.value.fullPath)
  }
})

  • 28
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
动态路由是指在Vue Router中,可以根据不同的参数值动态生成路由路径。通过动态路由,我们可以根据不同的参数值加载不同的组件或页面。在Vue Router中,我们可以使用冒号(:)来定义动态路由参数。例如,我们可以定义一个动态路由路径为`/user/:id`,其中`:id`表示一个动态的参数值。当用户访问`/user/1`时,Vue Router会根据参数值1加载相应的组件或页面。 路由守卫是指在Vue Router中,可以通过路由守卫来控制路由的访问权限和导航行为。Vue Router提供了三种类型的路由守卫:全局前置守卫、全局解析守卫和组件内的守卫。全局前置守卫会在路由切换之前被调用,可以用来进行权限验证或其他全局操作。全局解析守卫会在路由切换之前被调用,用来获取路由数据。组件内的守卫会在组件内部被调用,可以用来进行组件内部的权限验证或其他操作。 以下是一个示例代码,演示了如何使用动态路由路由守卫: ```javascript // 定义动态路由 const routes = [ { path: '/user/:id', component: User, meta: { requiresAuth: true // 设置需要登录才能访问的路由 } } ] // 创建路由实例 const router = new VueRouter({ routes }) // 全局前置守卫 router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { next('/login') // 如果需要登录才能访问的路由没有登录,则跳转到登录页面 } else { next() // 否则继续路由切换 } }) // 组件内的守卫 export default { beforeRouteEnter (to, from, next) { // 在进入路由前调用,可以访问组件实例this if (this.$store.state.user.isAdmin) { next() // 如果是管理员,则继续路由切换 } else { next(false) // 否则取消路由切换 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值