|
|
<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 选项用于监听组件中的数据变化,这里监听了 $route(Vue 路由对象)的变化,一旦路由发生改变,就会触发 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>
|