动态路由使用

目录

添加动态路由

添加单个路由

添加多个路由

指定路由添加的位置

导航守卫添加路由

删除动态路由


添加动态路由

添加动态路由的方法有两个:addRoutes(添加多个路由)和addRoute(添加单个路由),但是addRoutes只能vue2用,并且已经过时了,所以推荐用addRoute

添加单个路由
  • getRoutes() 可以查看所有路由

  • hasRoute() 可以查看是否有某路由

javascript 复制代码
<template>
  <main>
    <el-button @click="addRoutes">添加动态路由</el-button>
    <el-button @click="toDemo01">跳转Demo01</el-button>
  </main>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router'

const r = useRouter()

const addRoutes = () => {
  r.addRoute({
    path: '/demo01',
    name: 'demo01',
    component: () => import('@/views/Demo01.vue'),
  })
  
  // 查看所有路由
  console.log(r.getRoutes());
  // 查看是否存在某路由
  console.log(r.hasRoute('demo01'));
}

const toDemo01 = () => {
  r.push('/demo01')
}
</script>

还可以添加嵌套路由

  • 有一点需要注意:路由规则配置文件里,子路由可以不写前面的父路由路径,但是动态路由里不行,必须写完整路径
javascript 复制代码
<template>
  <main>
    <h2>Home</h2>
    <el-button @click="addRoutes">添加动态路由</el-button>
    <el-button @click="toDemo02">跳转Demo02</el-button>
  </main>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router'

const r = useRouter()

const addRoutes = () => {
  r.addRoute({
    path: '/demo01',
    name: 'demo01',
    children: [
      {
        path: '/demo01/demo02', // 子路由一定要完整 只写/demo02会报错查找不到路由
        name: 'demo02',
        component: () => import('@/views/Demo02.vue'),
      }
    ]
  })

  // 查看所有路由
  console.log(r.getRoutes());
  // 查看是否存在某路由
  console.log(r.hasRoute('demo02'));
}

const toDemo02 = () => {
  r.push('/demo01/demo02')
}
</script>

还可以添加动态路由

javascript 复制代码
<template>
  <main>
    <el-button @click="addRoutes">添加动态路由</el-button>
    <el-button @click="toDemo01">跳转Demo01</el-button>
  </main>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router'

const r = useRouter()

const addRoutes = () => {
  r.addRoute({
    path: '/demo01/:id', // 还可以添加动态路由  路由只要是  " /demo01/任意路由 "  都可以匹配到Demo01组件
    name: 'demo01',
    component: () => import('@/views/Demo01.vue'),
  })

  // 查看所有路由
  console.log(r.getRoutes());
  // 查看是否存在某路由
  console.log(r.hasRoute('demo01'));
}

const toDemo01 = () => {
  // r.push('/demo01/1')
  r.push('/demo01/100')
}
</script>
添加多个路由

添加多个动态路由,可以把所有路由对象组成一个数组,对数组进行遍历,然后挨个添加

javascript 复制代码
<template>
  <main>
    <el-button @click="addRoutes">添加动态路由</el-button>
    <el-button @click="toDemo01">跳转Demo01</el-button>
    <el-button @click="toDemo02">跳转Demo02</el-button>
  </main>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router'
import Demo01 from '@/views/Demo01.vue'
import Demo02 from '@/views/Demo02.vue'

const r = useRouter()

const addRoutes = () => {
  // 路由信息组成的数组
  const routeList = [
    {
      path: '/demo01',
      name: 'demo01',
      component: Demo01
    },
    {
      path: '/demo02',
      name: 'demo02',
      component: Demo02
    },
  ]

  // 只能遍历挨个添加
  routeList.forEach((item: any) => r.addRoute(item))

  // 查看所有路由
  console.log(r.getRoutes());
  // 查看是否存在某路由
  console.log(r.hasRoute('demo01'));
  console.log(r.hasRoute('demo02'));
}

const toDemo01 = () => {
  r.push('/demo01')
}

const toDemo02 = () => {
  r.push('/demo02')
}
</script>
指定路由添加的位置
  • 也就是可以指定路由添加到那个路由下面,addRoute第一个参数指定要添加到那,第二个参数正常的写路由信息

路由配置文件

javascript 复制代码
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('../views/AboutView.vue')
    }
  ]
})

export default router

我们希望路由添加到about路由里面,成为about的子路由

javascript 复制代码
<template>
  <main>
    <el-button @click="addRoutes">添加动态路由</el-button>
    <el-button @click="toDemo01">跳转Demo01</el-button>
  </main>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router'

const r = useRouter()

const addRoutes = () => {
  r.addRoute('about', {
    path: '/about/demo01', // 这里路由一定要写完整。路由规则配置文件里,子路由可以不写前面的路由路径,但是动态路由里不行,必须写完整路径
    name: 'demo01',
    component: () => import('@/views/Demo01.vue'),
  })

  // 查看所有路由
  console.log(r.getRoutes());
  // 查看是否存在某路由
  console.log(r.hasRoute('demo01'));
}

const toDemo01 = () => {
  r.push('/about/demo01')
}
</script>
导航守卫添加路由

一般做前端权限的时候用,添加后应该通过返回新的位置来触发重定向,不然地址栏输入路由不会跳转

javascript 复制代码
router.beforeEach(to => {
  if (!hasNecessaryRoute(to)) {
    router.addRoute(generateRoute(to))
    // 触发重定向
    return to.fullPath
  }
})
  • hasNecessaryRoute(to)这个方法是避免重定向的,函数结果返回一个布尔值就行了。to参数携带了要前往路由的具体信息,如果是已经添加过的动态路由,应该返回false,避免重复添加,造成路由重定向,如果没有添加过,则应该返回true,进行动态路由的添加

举个例子,hasNecessaryRoute函数可以这样写

javascript 复制代码
const hasNecessaryRoute = (to: any) => {
  // return router.getRoutes().some(route => route.path === to.path)
  // 或者下面这样
  return router.hasRoute(to.name)
}

前端权限思想

只是大致写了下思路,方法千奇百怪,能实现就行

  1. 点击登录的时候,调用接口,后端返回此用户的路由信息,

  2. 跳转路由到首页,然后触发全局前置导航守卫

  3. 在全局前置导航守卫中进行动态路由的添加

删除动态路由

通过添加一个名称冲突的路由。如果添加与现有途径名称相同的途径,会先删除路由,再添加路由

javascript 复制代码
router.addRoute({ path: '/about', name: 'about', component: About })
// 这将会删除之前已经添加的路由,因为他们具有相同的名字且名字必须是唯一的
router.addRoute({ path: '/other', name: 'about', component: Other })

通过使用 router.removeRoute() 按名称删除路由

javascript 复制代码
router.addRoute({ path: '/about', name: 'about', component: About })
// 删除路由
router.removeRoute('about')

注意:当路由被删除时,所有的别名和子路由也会被同时删除

相关推荐
Mr YiRan3 小时前
网络请求API监控与网络切换埋点
android·网络
AlienZHOU4 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
Captaincc7 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师9 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen9 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒9 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow10 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
当下新鲜事10 小时前
车间实测记录:三菱电机MR-J5伺服与压力控制方案的场景适配
网络·物联网·业界资讯
竹林81810 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007810 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端