You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mall-admin/src/components/Breadcrumb/index.vue

72 lines
5.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!-- el-breadcrumb 组件用于创建面包屑导航这里给它添加了类名 "app-breadcrumb"并设置分隔符为 "/"用于分隔面包屑中的各个节点 -->
<el-breadcrumb class="app-breadcrumb" separator="/">
<!-- transition-group 组件用于对一组元素进行过渡动画效果的包裹这里命名为 "breadcrumb"它会根据内部元素的添加删除移动等操作自动应用过渡动画常用于展示动态变化的元素列表此处用于面包屑导航项的过渡效果处理 -->
<transition-group name="breadcrumb">
<!-- 使用 v-for 指令遍历 levelList 数组创建多个 el-breadcrumb-item 组件面包屑导航的每一项并将数组中的每个元素item以及对应的索引index传递到循环体内部使用同时通过 :key 绑定每个项的唯一标识这里使用 item.path确保 Vue 能够正确识别每个元素的变化 -->
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path" v-if="item.meta.title">
<!-- 根据条件判断来决定面包屑导航项的显示方式,如果该项的 redirect 属性等于 "noredirect" 或者当前项是 levelList 数组中的最后一项index == levelList.length - 1则使用 span 标签显示该项的标题item.meta.title并且添加类名 "no-redirect",用于后续样式设置 -->
<span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{item.meta.title}}</span>
<!-- 如果不满足上述条件(即可以进行路由跳转的情况),则使用 router-link 组件创建一个路由链接,通过 :to 属性绑定要跳转的目标路径(优先使用 item.redirect如果不存在则使用 item.path并在链接中显示该项的标题item.meta.title点击该链接可导航到对应的路由页面 -->
<router-link v-else :to="item.redirect||item.path">{{item.meta.title}}</router-link>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
export default {
// created 生命周期钩子函数,在组件实例被创建后立即调用,这里调用了 this.getBreadcrumb 方法,用于初始化获取面包屑导航的数据,确保在组件首次渲染时就能展示正确的面包屑信息
created() {
this.getBreadcrumb()
},
data() {
return {
// 定义一个名为 levelList 的数据属性,初始值为 null它将用于存储面包屑导航对应的路由信息数组后续会通过 getBreadcrumb 方法来填充这个数组,每个元素代表面包屑中的一项对应的路由相关数据
levelList: null
}
},
// watch 选项用于监听组件中的数据变化,这里监听了 $routeVue 路由对象)的变化,一旦路由发生改变,就会触发 this.getBreadcrumb 方法,重新获取并更新面包屑导航的数据,以保证面包屑能够实时反映当前的路由情况
watch: {
$route() {
this.getBreadcrumb()
}
},
methods: {
getBreadcrumb() {
// 通过 this.$route.matched 获取当前路由匹配的所有路由记录数组(包含了从根路由到当前路由的所有嵌套路由记录),然后使用 filter 方法筛选出其中有 name 属性的路由记录(通常有 name 属性的路由才方便进行导航等相关操作),将筛选后的结果赋值给 matched 变量
let matched = this.$route.matched.filter(item => item.name)
const first = matched[0]
// 判断筛选后的第一个路由记录(即最顶层匹配的路由)是否存在,并且其 name 属性不等于 'home',如果满足这个条件
if (first && first.name!== 'home') {
// 则在 matched 数组的开头插入一个新的路由记录,表示首页路由,它的路径为 '/home'元数据meta中的标题设置为 '首页',这样做可能是为了确保面包屑导航中始终能显示首页作为根节点(除非当前就在首页路由)
matched = [{ path: '/home', meta: { title: '首页' }}].concat(matched)
}
// 将处理后的 matched 数组赋值给 levelList 属性,使得模板中可以根据这个数组来渲染面包屑导航的各项内容
this.levelList = matched
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
// 选择器匹配类名为 "app-breadcrumb" 的元素内部的类名为 "el-breadcrumb" 的子元素(也就是前面模板中定义的面包屑导航组件),设置以下样式属性
.app-breadcrumb.el-breadcrumb {
// 将元素显示为行内块级元素,使其既可以在水平方向上与其他元素并排显示,又能设置宽度、高度等块级元素的属性
display: inline-block;
// 设置字体大小为 14px用于控制面包屑导航文字的大小显示
font-size: 14px;
// 设置行高为 50px使得面包屑导航中的文字在垂直方向上能够较好地居中对齐并且影响整个面包屑导航在垂直方向上的布局高度
line-height: 50px;
// 设置元素左侧的外边距为 10px用于与其他相邻元素在水平方向上拉开一定的间距使布局更美观
margin-left: 10px;
// 针对类名为 "no-redirect" 的子元素(即模板中那些不进行路由跳转,只是展示文本的面包屑导航项)设置样式,以下是具体的样式属性说明
.no-redirect {
// 设置文字颜色为 #97a8be一种特定的颜色用于区分这类特殊的面包屑导航项与可点击跳转的导航项
color: #97a8be;
// 将鼠标指针样式设置为文本光标样式cursor: text表示该元素不可点击因为它不进行路由跳转给用户视觉上的提示
cursor: text;
}
}
</style>