element ui组件库使用面包屑组件

效果展示:

在这里插入图片描述

实现的思路

  • 需要在路由的meta中设置breadNumber字段,‘一级页面’不设置breadNumber(因为大部分页面是一级页面,所以就不设置了~),‘二级页面’设置breadNumber=2,‘三级页面’设置breadNumber=3,以此类推…
  • meta的定义:meta简单来说就是路由元信息 也就是每个路由身上携带的信息。
  • meta的作用:有利于我们处理seo的东西,我们在html中加入meta标签,就是有利于处理seo的东西,搜索引擎
  • 在面包屑的页面监听路由,路由变化时则触发面包屑数据处>理事件,数据处理详细在getBreadcrumb方法
  • 面包屑数据处理完成后,要做刷新页面时缓存数据的操作(这里是用vuex配合sessionStorage来实现)

代码的具体实现思路:

路由配置:

import Vue from "vue";
import VueRouter from "vue-router";

Vue.use(VueRouter);

const routes = [
  {
    
    
    path: "/",
    component: () => import("../views/Home.vue"),
    children: [
      {
    
    
        path: "/index1",
        component: () => import("../views/index1.vue"),
        meta: {
    
    
          requireAuth: true,
        },
      },
      {
    
    
        path: "/index2",
        name: "index2",
        component: () => import("../views/index2.vue"),
        meta: {
    
    
          requireAuth: true,
          breadNumber: 2,
        },
      },
      {
    
    
        path: "/index3",
        name: "index3",
        component: () => import("../views/index3.vue"),
        meta: {
    
    
          requireAuth: true,
          breadNumber: 3,
        },
      },
      {
    
    
        path: "/index4",
        name: "index4",
        component: () => import("../views/index4.vue"),
        meta: {
    
    
          requireAuth: true,
          breadNumber: 4,
        },
      },
    ],
  },
];

const router = new VueRouter({
    
    
  mode: "history",
  base: process.env.BASE_URL,
  routes,
});

export default router;

组件中使用:

<template>
  <div>
    <el-container>
      <el-header></el-header>
      <el-container>
        <el-aside width="200px">
          <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
            <el-menu :default-openeds="['1', '3']" router>
              <el-submenu index="1">
                <el-menu-item index="/index1">选项1</el-menu-item>
                <el-menu-item index="/index2">选项2</el-menu-item>
                <el-menu-item index="/index3">选项3</el-menu-item>
                <el-menu-item index="/index4">选项4</el-menu-item>
              </el-submenu>
            </el-menu>
          </el-aside></el-aside
        >
        <el-main>
          <div class="box">
            <!--面包屑-->
            <el-breadcrumb class="breadcrumb" separator="/">
              <!--面包屑列表,这里的vfor和vif不能一起使用,要切记-->
              <el-breadcrumb-item v-for="(item, index) in breadList" :key="index" @click.native="breadcrumbClick(item)" v-if="item.name" style="cursor: pointer">
                {
   
   { item.name }}
              </el-breadcrumb-item>
            </el-breadcrumb>
          </div>
          <router-view> </router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  watch: {
    // 监听路由的变化
    $route() {
      this.getBreadcrumb();
    },
  },
  methods: {
    // 面包屑数据处理
    getBreadcrumb() {
      let that = this;
      // 由于本项目大部分属于‘一级’页面,所以在设置路由时候,一级页面不设置breadNumber = 1,‘二级’页面以上才设置breadNumber
      let breadNumber = typeof this.$route.meta.breadNumber !== "undefined" ? this.$route.meta.breadNumber : 1;
      // 获取当前页面的名字和路由,并组合成新的对象
      let newBread = { name: this.$route.name, path: this.$route.fullPath };
      let vuexBreadList = []; // 默认初始化面包屑数据
      if (breadNumber !== 1) {
        // 当前面包屑breadNumber大于1时才会从vuex中获取值
        vuexBreadList = that.$store.state.breadListState; // 获取breadList数组
      }
      if (breadNumber < vuexBreadList.length) {
        // "回退"面包屑----判断条件:当前路由breadNumber小于vuexBreadList的长度
        vuexBreadList.splice(breadNumber - vuexBreadList.length, vuexBreadList.length - breadNumber);
      }
      if (breadNumber > vuexBreadList.length) {
        // 添加面包屑----判断条件:当前路由breadNumber大于vuexBreadList的长度
        vuexBreadList.push(newBread);
      }
      // 处理完数据后,将最终的数据更新到vuex(用于页面刷新)
      that.$store.commit("breadListMutations", vuexBreadList);
      // 处理完数据后,将最终的数据更新为新的面包屑数组
      that.breadList = vuexBreadList;
    },
    // 面包屑点击事件
    breadcrumbClick(item) {
      this.$router.push({
        path: item.path,
      });
    },
  },
};
</script>

vuex 的配置:


import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
    
    
  state: {
    
    
    breadListState: [], // 面包屑列表数据
  },
  mutations: {
    
    
    breadListMutations(getters, list) {
    
    
      getters.breadListState = list;
    },
  },
  actions: {
    
    },
  modules: {
    
    },
});

APP.vue页面的相关配置(用于页面刷新时缓存vuex数据)

  created: function () {
    
    
    // 在页面加载时读取sessionStorage里的状态信息
    sessionStorage.getItem("umeetCloudVuex") && this.$store.replaceState(Object.assign(this.$store.state, JSON.parse(sessionStorage.getItem("umeetCloudVuex"))));
    // 在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener("beforeunload", () => {
    
    
      sessionStorage.setItem("umeetCloudVuex", JSON.stringify(this.$store.state));
    });
  },

此文章有那些需要修改的地方,请尽快指出,会即使修改!

猜你喜欢

转载自blog.csdn.net/weixin_46174785/article/details/110502372
今日推荐