在Vue3中实现动态路由的示例代码

 更新时间:2024年07月10日 09:49:38   作者:大厂前端程序员  
Vue3中的动态路由是一种高级功能,它允许你在URL中包含变量,这些变量可以在组件内部通过$route.params对象访问,动态路由通常用于构建可配置性强、更具灵活性的应用,本文详细介绍了如何在vue3中实现动态路由,需要的朋友可以参考下

选用技术栈vue3+typescripy+element-plus ui+router 4

编写通用动态路由菜单

目标:根据路由配置信息,自动生成菜单内容。实现更通用、更自动的菜单配置。

通用路由菜单组件实现步骤

1.提取通用路由文件

2.菜单组件读取路由,动态渲染菜单项

3.绑定跳转事件

4.同步路由的更新到菜单项高亮

5.按需补充更多能力

(1)提取通用路由文件

 把 router/index.ts 中的路由变量定义为单独的文件 routes.ts,代码如下:

export const routes: Array<RouteRecordRaw> = [
    {
        path: '/shouye',
        name: '首页',
        component: Shouye,
    },
    {
      path: '/keichengxuexi',
      name: '课程学习',
      component: Courselearning,
    },
}

然后在 router/index.ts 中引入 routes.

(2)菜单组件读取路由,动态渲染菜单项

<script setup lang= ts >
import { routes }from "../router/routes";
</script>

模板中根据路由数组渲染菜单:

<el-menu-item v-for="item in routes" :key="item.path">
  {{ item.name }}
</el-menu-item>

(3)绑定跳转事件

import { useRoute, useRouter } from "vue-router";
const router = useRouter();
 
// 路由跳转事件
const doMenuClick = (key: string) => {
  router.push({
    path: key,
  });
};

模板修改:

<el-menu
  mode="horizontal"
  @menu-item-click="doMenuClick"
>
  ...
</el-menu>

(4)同步路由的更新到菜单项高亮

同步高亮原理:首先点击菜单项 => 触发点击事件并跳转更新路由 => 更新路由后,同步去更新菜单栏的高亮状态。

使用 Vue Router 的 afterEach 路由钩子实现:

const router = useRouter();
 
// Tab 栏选中菜单项
const selectedKeys = ref(["/"]);
// 路由跳转后,更新选中的菜单项
router.afterEach((to, from, failure) => {
  selectedKeys.value = [to.path];
});

模板引入变量:

<el-menu
  mode="horizontal"
  :default-active="selectedKeys[0]" 
  @menu-item-click="doMenuClick"
>
</el-menu>

还可以给路由菜单组件增加更多能力。

(5)按需补充更多能力(可以参考网上的框架),比如根据配置控制菜单的显隐

利用 routes 配置的 meta 属性实现。routes.ts 中给路由配置新增一个标志位 hideInMenu,用于判断路由是否显隐:

  {
    path: "/hide",
    name: "隐藏页面",
    component: HomeView,
    meta: {
      hideInMenu: true,
    },
  },

然后根据该标志位过滤路由数组,仅保留需要展示的元素。

不要用 v-for + v-if 去条件渲染元素,这样会先循环所有的元素,导致性能的浪费。

// 展示在菜单的路由数组
const visibleRoutes = routes.filter((item) => {
  if (item.meta?.hideInMenu) {
    return false;
  }
  return true;
});

整体的代码实现如下

菜单栏组件GlobalHeader.vue

<template>
  <div id="globalHeader">
    <el-menu :default-active="selectedKeys[0]" 
             class="el-menu-demo" 
             mode="horizontal" 
             @select="handleSelect"
             background-color="rgb(255, 165, 104)" 
             text-color="white"
             active-text-color="rgb(0,0,51)">
          <el-menu-item v-for="item in visibleRoutes" :key="item.path">
            <el-sub-menu v-if="item.children" :index="item.path">
              <template #title>
                {{ item.name }}
              </template>
              <el-menu-item v-for="child in item.children" :key="child.path" @click="doMenuClick(`${item.path}/${child.path}`)">
                {{ child.name }}
              </el-menu-item>
            </el-sub-menu>
            <template v-else>
          <el-menu-item @click="doMenuClick(item.path)">
            {{ item.name }}
          </el-menu-item>
        </template>
      </el-menu-item>
    </el-menu>
  </div>
</template>

上述菜单由于加入了子菜单的原因,所以增加了一层if的判断逻辑。这个路由下是否还有子路由。

<script setup lang="ts">
import { routes } from '../router/routes'
import { useRouter } from 'vue-router'
import { ref } from 'vue'
 
 
const handleSelect = (key: string, keyPath: string[]) => {
  console.log(key, keyPath)
}
 
const router = useRouter();
//当前选中的菜单项
const selectedKeys = ref(["/"]);
//路由跳转时,选中菜单项1
router.afterEach((to, from) => {
  selectedKeys.value = [to.path];
})
 
//展示在菜单中的路由
const visibleRoutes = routes.filter((item) => {
  if (item.meta?.hideInMenu) {
    console.log('隐藏的菜单:', item.name);
    return false;
  }
  return true;
})
 
//点击菜单跳转到对应页面
const doMenuClick = (key: string) => {
  router.push({
    path: key,
  });
}
 
 
</script>

routes.ts 路由组件

import {  RouteRecordRaw } from "vue-router";
import Shouye from "../views/Shouye.vue";
import Courselearning from "../views/Courselearning.vue";
 
//vue3引入路由的方式
export const routes: Array<RouteRecordRaw> = [
    {
        path: '/shouye',
        name: '首页',
        component: Shouye,
    },
    {
      path: '/keichengxuexi',
      name: '课程学习',
      component: Courselearning,
      meta:{
        hideInMenu: true,
      },
    },
    {
      path: '/ketangxiaolian',
      name: '课堂小练',
      children: [
        {
            path: '/network-world',
            name: '神奇的网络世界',
            component: Networld,
        },
        {
            path: '/internet',
            name: '走进互联网',
            component: Internet,
        },
        {
            path: '/information-collection',
            name: '网上收集信息',
            component: Collectinformation,
        },
        {
            path: '/communication',
            name: '网上交流信息',
            component: Communication,
        },
        {
            path: '/soho-network',
            name: '组件SOHO网络',
            component: Sohonetwork,
        },
    ]
    },
}

以上就是在Vue3中实现动态路由的示例代码的详细内容,更多关于Vue3动态路由的资料请关注脚本之家其它相关文章!

相关文章

  • 一个因@click.stop引发的bug的解决

    一个因@click.stop引发的bug的解决

    这篇文章主要介绍了一个因@click.stop引发的bug的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • VUE写一个简单的表格实例

    VUE写一个简单的表格实例

    在本篇文章里小编给大家整理的是关于VUE中表格的写法实例以及相关知识点内容,需要的朋友们可以参考下。
    2019-08-08
  • vue中$emit传递多个参(arguments和$event)

    vue中$emit传递多个参(arguments和$event)

    本文主要介绍了vue中$emit传递多个参(arguments和$event),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • vue修改props数据报错的问题及解决

    vue修改props数据报错的问题及解决

    这篇文章主要介绍了vue修改props数据报错的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue实现轮播图的多种方式

    vue实现轮播图的多种方式

    这篇文章给大家介绍了vue实现轮播图的多种方式,文中给出了四种实现方式,并通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,感兴趣的朋友可以参考下
    2024-02-02
  • Vite配置优雅的code spliiting代码分割详解

    Vite配置优雅的code spliiting代码分割详解

    这篇文章主要为大家介绍了Vite配置优雅的code spliiting代码分割详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Vue前端实现截图功能的简单步骤

    Vue前端实现截图功能的简单步骤

    本文介绍了如何使用html2canvas库来实现HTML页面或某个元素的截图功能,文中通过代码介绍的非常详细,需要注意的是此方法只能在浏览器环境中使用,需要的朋友可以参考下
    2024-10-10
  • 在Vue 中获取下拉框的文本及选项值操作

    在Vue 中获取下拉框的文本及选项值操作

    这篇文章主要介绍了在Vue 中获取下拉框的文本及选项值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue.js学习之vue-cli定制脚手架详解

    vue.js学习之vue-cli定制脚手架详解

    这篇文章主要给大家介绍了vue.js学习之vue-cli定制脚手架的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • Vant Weapp组件picker选择器初始默认选中问题

    Vant Weapp组件picker选择器初始默认选中问题

    这篇文章主要介绍了Vant Weapp组件picker选择器初始默认选中问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论