<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>
