Vue3动态面包屑的实现

简介: Vue3动态面包屑的实现

前言


在进行项目开发的过程中,我们一般会使用面包屑的功能,这个功能还是比较常见的,那么他的实现思路是什么呢?


面包屑的介绍和实现思路✍️✍️


首先我们先来了解一下面包屑功能,这个功能其实就是根据路由的地址,来动态的生成导航菜单,今后在路由发生变化的时候,这个导航菜单也会动态的发生变化,就像下面展示的这样:

image.png

那么像这样的功能我们该如何实现呢?

  • 对于这个面包屑来说,他的静态版本我们可以直接在element-plus上面直接复制粘贴即可,这个不做过多的赘述
  • 我们要实现的版本是动态的进行渲染,那么这个就需要我们获取相应路由的数据结构(比如说数组),该如何获取相应的路由数据呢?

因此完成面包屑组件的关键就是在于获取相应路由数据上面,这就是典型的数据驱动


获取路由数据⚡️⚡️


我们要实现这个功能就需要用到route.matched,代码如下

//首先实例化获取当前路由
const route=useRoute()
//然后调用route.matched

对route.matched的理解


首先我们来看官方给出的解释:

官方解释: 与给定路由地址匹配的标准化的路由记录数组。

个人理解:我个人的理解就是从根据你访问的路由,然后向上找,找到当前路由的根路由然后返回一个数组,这个数组包含的就是你当前访问的路由加上根路由,可能这么说你还是不是很理解,那么我就举一个例子:

const router=[{
  path: "/user",
  component: Layout
  children: [
    {path: "/user/manage", component:Manage },
    {path: "/user/info/:id", component:userInfo   },
    {path: "/user/import",  component:import  },
  ],
}]

这里不做路由的细节展示,只是为了说明一个例子,如果我们访问/user/manage这个地址的时候,此时如果我们使用route.matched打印结果会得到如下结果:

[  { path: '/user', component: Layout,children:[...所有的子路由] },
  { path: '/user/manage', component: Manage }
]

这样我们就能根据获取的数组来进行面包屑的渲染了。


开始完成动态面包屑🥊🥊


在进行完前期的铺垫之后,我们就可以开始完成动态的面包屑了

封装面包屑组件:

我们查看element-plus官网的相关信息之后,发现要实现面包屑的功能需要使用这两个组件

  • el-breadcrumb用来包裹所有子项
  • el-breadcrumb-item这是每个子项

废话不多说直接展示源码:

首先是布局部分

<template>
  <div>
    <el-breadcrumb class="breadcrumb" separator="/">
      <transition-group name="breadcrumb">
        <el-breadcrumb-item
          v-for="(item, index) in breadcrumbData"
          :key="item.path"
        >
          <!-- 不可以点击项 -->
          <span
            v-if="index === breadcrumbData.length - 1"
            class="no-redirect"
            >{{ item.meta.title }}</span
          >
          <!-- 可以点击项 -->
          <a v-else class="redirect" @click.prevent="onLinkClick(item)">{{
            item.meta.title
          }}</a>
        </el-breadcrumb-item>
      </transition-group>
    </el-breadcrumb>
  </div>
</template>

第一部分的代码就是根据获取的路由数据进行面包屑的渲染,使用了v-for来进行el-breadcrumb-item的渲染,我们在这里规定了数组的最后一项是不可被点击的,并且给它指定了样式,然后其他项就可以被点击,并且绑定了点击事件,将渲染的item传递过去,我们重点来讲解一下js这部分的代码。

js部分的代码:

<script setup>
import { ref, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useStore } from "vuex";
const route = useRoute();
const router = useRouter();
// 生成数组数据
const breadcrumbData = ref([]);
const getBreadcrumbData = () => {
  console.log(route.matched);
  breadcrumbData.value = route.matched.filter((item) => {
    return item.meta && item.meta.title;
  });
};
// 监听路由发生改变时触发
watch(
  route,
  () => {
    getBreadcrumbData();
  },
  {
    immediate: true,
  }
);
// 处理点击事件
const onLinkClick = (item) => {
  router.push(item.path);
};
// 如果将来需要进行主题替换,所以这里获取下动态样式
const store = useStore();
// eslint-disable-next-line
const linkHoverColor = ref(store.getters.globalCss.breadCrumbColor);
</script>
  • 首先我们先定义了一个数组,这个数组用来保存要渲染的面包屑数据项
  • 接着我们定义了一个函数,这个函数是为了获取当前的路由项和在与给定路由匹配的根路由和这个路由,然后过滤一下数据项,根据数据项中是否有title和meta对象来过滤数据,最终返回一个数组,里面就是面包屑要展示的数据,其实和侧边栏数据是对应的
  • 我们这里还是用了watch来监测route的数据的变化,每当数据发生变化时候就调用getBreadcrumbData这个方法,重新给数组赋值
  • 紧接着我定义了一个点击事件,每当用户点击之后相应的子项的时候,我们就会跳转到相应的页面。
  • 我们这里还是使用vuex,这个是为了之后项目可能会使用全局更换颜色(换肤功能),所以这里使用了全局的数据共享,根据Vue3新增的特性,我们可以在css中使用这个变量,当vuex中的数据改变,那么样式就会进行相应改变。

动画样式的完成

.breadcrumb-enter-active,
.breadcrumb-leave-active {
  transition: all 0.5s;
}
.breadcrumb-enter-from,
.breadcrumb-leave-active {
  opacity: 0;
  transform: translateX(20px);
}
.breadcrumb-leave-active {
  position: absolute;
}

基本的样式的完成:

.breadcrumb {
  display: flex;
  font-size: 14px;
  line-height: 50px;
  margin-left: 8px;
  .no-redirect {
    color: #97a8be;
    cursor: text;
  }
  .redirect {
    color: #666;
    font-weight: 600;
  }
  .redirect:hover {
    // 将来需要进行主题替换,所以这里不去写死样式,这个是vue3的新增特性
    color: v-bind(linkHoverColor);
  }
}

到这一步我们的面包屑功能就算完成了,具体的演示我在一开始就进行了,大家可以参考我的代码进行实现。


总结🐰🐰


面包屑这个东西我在很早之前实现过,不过那个时候还是学vue2的时候,再加上时间间隔的比较长,因此有些生疏了,今天在来实现一下,巩固一下原有的知识,做一个总结。

相关文章
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
562 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
263 1
|
7月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1016 5
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
424 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
294 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
479 1
|
4月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
285 0
|
5月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
145 0
|
7月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
636 17
|
7月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1812 0

热门文章

最新文章