element动态路由面包屑的实现示例

要掌握:localStorage,组件封装​

emm,第一次上传视频转gif的图片,效果不咋好。。。
视频转gif 的软件连接 https://www.jb51.net/softs/723131.html

在 components 下新建一个 curmbs 文件夹,并在该文件夹下新建一个 index.vue 文件。

router.js 中的配置,添加一个 meta对象

代码

<template>
  <div class="crumbs">
    <!-- 面包屑 -->
    <el-card class="box-card">
      <el-breadcrumb separator="/">
        <el-breadcrumb-item v-for="(level,index)  in this.levelList" :key="index" :to="level.path">
          {{level.name}}
        </el-breadcrumb-item>
      </el-breadcrumb>
    </el-card>

  </div>
</template>

<script>
export default {
  name : "crumbs",
  data() {
    return {
        levelList: []
    }
  },
  watch: {
    $route(to,from) {
      console.log(to,from)
      // 思路:判断meta中breadNumber为几,就把它放在第几个
      // 注意:存放到localStorage中的数据格式最好统一,我在这里把它统一成了数组的格式
      // levelList最终的格式要为:[{name:"xx",path:"xx",breadNum:"xx"}]
      this.getBreadcrumb()
    }
  },
  methods:{
    getBreadcrumb() {
      // 1.获取当前的name,path,breadNumber
      var newName = this.$route.name;
      var newPath = this.$route.fullPath;
      var newBreadNum = this.$route.meta.breadNumber;   

      // 2.获取前一页存下的name,path,breadNumber
      var oldName = JSON.parse(window.localStorage.getItem("oldName"));
      var oldPath = JSON.parse(window.localStorage.getItem("oldPath"));
      var oldBreadNum = JSON.parse(window.localStorage.getItem("oldBreadNum"));
      var routerInfo =  JSON.parse(window.localStorage.getItem("routerInfo")) || [];  

      this.levelList = routerInfo;     

      // 3.判断是否是第一层,即初始位置,如果是第一层,分两种情况
      if(this.$route.meta.breadNumber === 1){
      // 3.1 localStorage有值,那么this.levelList不是空值,说明是由上一个主路由进来的,需要清空之前localStorage的值,并且重新赋值给levelList
        if(this.levelList.length != 0 ){
          localStorage.removeItem("oldName");
          localStorage.removeItem("oldPath");
          localStorage.removeItem("oldBreadNum");
          localStorage.removeItem("routerInfo");
          this.levelList = [];
        }
      // 3.2 localStorage没有值,说明就是第一次进主路由,直接赋值
        this.levelList.push({"name":newName,"path":newPath,"breadNumber":newBreadNum});
        // this.$store.commit('breadCrumb/BREAD_PATH',{ newName,newPath,newBreadNum });
        // 按照数组格式的方式存放
        var nameStr = [];
        nameStr.push(newName);
        var pathStr=[];
        pathStr.push(newPath);
        var breadNumStr= [];
        breadNumStr.push(newBreadNum);

        window.localStorage.setItem("oldName",JSON.stringify(nameStr));
        window.localStorage.setItem("oldPath",JSON.stringify(pathStr));
        window.localStorage.setItem("oldBreadNum",JSON.stringify(breadNumStr));
        window.localStorage.setItem("routerInfo",JSON.stringify(this.levelList));

      }
      else{
        var isBreadNumber = false;
        // 4.breadNumber除了等于1,其他值时,this.levalList一定不是空值,判断点击的这个breadNumber数组中是否存在
        // 4.1 如果存在,就要删掉这个后面的所有值,并且将点击所获得的的这个值存进this.levalList数组中
        // 4.2 如果不存在,说明是按照顺序进行的,把它存到localStorage中,并把值给this.leavalList数组
          //在这里不用return,否则会终止循环
          for(var i = 0 ;i< this.levelList.length; i++){
            if(this.levelList[i].breadNumber == newBreadNum){
              // return true; // 为true时表示数组内已存在 false表示不存在
              isBreadNumber = true;
              break;
            }
          }

          if( isBreadNumber ){
            //删除点击的后面所有信息,localStorage中的数据也要删除(这里的删除是截取,而不是完全删除),然后将该信息添加进去
            //要注意的是,这里的变化还有可能是点击面包屑时产生的,其他地方通常是通过路由跳转得到的
            // 注意这里splice的用法,如果直接写在localStorage.setItem 中,得到的值是被截取的值,而不是截取后的值
            oldName.splice(newBreadNum,oldName.length-newBreadNum );
            window.localStorage.setItem("oldName",JSON.stringify( oldName ));

            oldPath.splice(newBreadNum,oldPath.length-newBreadNum);
            window.localStorage.setItem("oldPath",JSON.stringify( oldPath ));

            oldBreadNum.splice(newBreadNum,oldBreadNum.length-newBreadNum);
            window.localStorage.setItem("oldBreadNum",JSON.stringify( oldBreadNum ));

            routerInfo.splice( newBreadNum,routerInfo.length-newBreadNum);
            window.localStorage.setItem("routerInfo",JSON.stringify( routerInfo ))

          }
          else{
            var oldNameStr = JSON.parse(window.localStorage.getItem("oldName"));
            oldNameStr.push(newName);
            window.localStorage.setItem("oldName",JSON.stringify(oldNameStr));

            var oldPathStr = JSON.parse(window.localStorage.getItem("oldPath"));
            oldPathStr.push(newPath);
            window.localStorage.setItem("oldPath",JSON.stringify(oldPathStr));

            var oldBreadNumStr = JSON.parse(window.localStorage.getItem("oldBreadNum"));
            oldBreadNumStr.push(newBreadNum);
            window.localStorage.setItem("oldBreadNum",JSON.stringify(oldBreadNumStr));

            this.levelList.push({"name":newName,"path":newPath,"breadNumber":newBreadNum});
            window.localStorage.setItem("routerInfo",JSON.stringify(this.levelList));
          }
        }
      }

  },

  created(){
    this.getBreadcrumb();
  }
}
</script>

<style scoped lang="scss">
.box-card{
  margin-bottom: 20px;
}
</style>

上面 localStorage存储的name, path,breadNum 是我测试的时候存的,也可以删除,简洁版代码:

<template>
  <div class="crumbs">
    <!-- 面包屑 -->
    <el-card class="box-card" v-show="isShow">
      <el-breadcrumb separator="/">
        <el-breadcrumb-item >
          <a href="javascript:;">{{$route.matched[0].name}}</a>
        </el-breadcrumb-item>
        <el-breadcrumb-item v-for="(level,index)  in this.levelList" :key="index" :to="level.path">
          {{level.name}}
        </el-breadcrumb-item>
      </el-breadcrumb>
    </el-card>

  </div>
</template>

<script>
export default {
  name : "crumbs",
  props:{
    isShow:{
        type:Boolean,
        default:true //默认值为true 显示
    }
  },
  data() {
    return {
        levelList: []
    }
  },
  watch: {
    $route(to,from) {
      // console.log(to,from)
      // 思路:判断meta中breadNumber为几,就把它放在第几个
      // 注意:存放到localStorage中的数据格式最好统一,我在这里把它统一成了数组的格式
      // levelList最终的格式要为:[{name:"xx",path:"xx",breadNum:"xx"}]
      this.getBreadcrumb()
    }
  },
  methods:{
    getBreadcrumb() {
      // 1.获取当前的name,path,breadNumber
      var newName = this.$route.name;
      var newPath = this.$route.fullPath;
      var newBreadNum = this.$route.meta.breadNumber;   

      // 2.获取前一页存下的name,path,breadNumber
      var routerInfo =  JSON.parse(window.localStorage.getItem("routerInfo")) || [];
      this.levelList = routerInfo;     

      // 3.判断是否是第一层,即初始位置,如果是第一层,分两种情况
      if(this.$route.meta.breadNumber === 1){
      // 3.1 localStorage有值,那么this.levelList不是空值,说明是由上一个主路由进来的,需要清空之前localStorage的值,并且重新赋值给levelList
        if(this.levelList.length != 0 ){
          localStorage.removeItem("routerInfo");
          this.levelList = [];
        }
      // 3.2 localStorage没有值,说明就是第一次进主路由,直接赋值
        this.levelList.push({"name":newName,"path":newPath,"breadNumber":newBreadNum});
        // 按照数组格式的方式存放
        window.localStorage.setItem("routerInfo",JSON.stringify(this.levelList));
      } else{ 

      // 4.breadNumber不等于1时,那么this.levalList一定不是空值,判断获取到的这个breadNumber在数组中是否存在
        var isBreadNumber = false;
        for(var i =0 ;i< this.levelList.length; i++){
          if(this.levelList[i].breadNumber == newBreadNum){
            // return true; // 为true时表示数组内已存在 false表示不存在
            isBreadNumber = true;
            break; //在这里不用return,return会终止循环
          }
        }

        // 4.1 如果存在,说明是所有路由展示已经完(或者是展示了前面几个,然后点击面包屑),点击面包屑上其中的一个标签
        //就要删掉这个后面的所有值,并且将点击所获得的的这个值存进this.levalList数组中
        if( isBreadNumber ){
          //删除点击的后面所有信息,localStorage中的数据也要删除(这里的删除是截取,而不是完全删除),然后将该信息添加进去
          //要注意的是,这里的变化还有可能是点击面包屑时产生的,其他地方通常是通过路由跳转得到的
          // 注意这里splice的用法,如果直接写在localStorage.setItem 中,得到的值是被截取的值,而不是截取后的值
          routerInfo.splice( newBreadNum,routerInfo.length-newBreadNum);
          window.localStorage.setItem("routerInfo",JSON.stringify( routerInfo ));
        } else { 

	      // 4.2 如果不存在,说明是按照顺序进行的,如一级跳到二级,再从二级跳到三级
	      //把它存到localStorage中,并把值给this.leavalList数组
          this.levelList.push({"name":newName,"path":newPath,"breadNumber":newBreadNum});
          window.localStorage.setItem("routerInfo",JSON.stringify(this.levelList));
        }

      }
    }
  },

  created(){
    this.getBreadcrumb();
  }
}
</script>

<style scoped lang="scss">
.box-card{
  margin-bottom: 20px;
}

</style>

注册

如果想要一部分页面显示该组件,一部分不显示,那么需要用到 props 传参。
具体做法参考:
(1)在 index.js 中

<el-card class="box-card" v-show = "isShow">
export default {
props:{
       isShow:{
          type:Boolean,
          default:true //默认值为true 显示
       }
    }
}

(2) 组件调用时

<crumbs :isShow=false></crumbs> //false表示不显示面包屑

如果想要将左侧主导航栏也显示出来,则添加代码:
原代码:

<el-breadcrumb separator="/">
   <el-breadcrumb-item v-for="(level,index)  in this.levelList" :key="index" :to="level.path">
     {{level.name}}
   </el-breadcrumb-item>
 </el-breadcrumb>
<el-breadcrumb-item >
  <a href="javascript:;">{{$route.matched[0].name}}</a>
</el-breadcrumb-item>

到此这篇关于element动态路由面包屑的实现示例的文章就介绍到这了,更多相关element动态路由面包屑内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • VUE+elementui面包屑实现动态路由详解

    我的路由: const routerMap = [ { path: '/', redirect: 'dashboard', component: Layout, name:'Dashboard', children: [ { path: 'dashboard', component: () => import('@/view/dashboard'), name: 'Dashboard', meta: { title: 'dashboard', icon: 'dashboard', noCache

  • element动态路由面包屑的实现示例

    要掌握:localStorage,组件封装​ emm,第一次上传视频转gif的图片,效果不咋好... 视频转gif 的软件连接 https://www.jb51.net/softs/723131.html 在 components 下新建一个 curmbs 文件夹,并在该文件夹下新建一个 index.vue 文件. router.js 中的配置,添加一个 meta对象 代码 <template> <div class="crumbs"> <!-- 面包屑

  • 利用React高阶组件实现一个面包屑导航的示例

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁,比如react-router 中的 withRouter 以及 react-redux 中 connect 等许多 API 都是以这样的方式来实现的. 使用 React 高阶组件的好处 在工作中,我们经常会有很多功能相似,组件代码重复的页面需求,通常我们可以通过完全复制一遍代码的方式实现功能,但是这

  • bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法

    本文实例讲述了bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法.分享给大家供大家参考,具体如下: Bootstrap官网中,只介绍了breadcrumb的布局(如下图),未介绍使用方法,如何动态增加面包屑title及点击事件的响应. 本人在使用过程中探索出以下的方式. 首先,在html文件里定义div <div> <ul class="breadcrumb " style="margin-bottom:0px;visibility:

  • vue+elementUI动态生成面包屑导航教程

    效果如下所示: 项目需要动态生成面包屑导航,并且首页可以点击.其余为路径显示 <el-menu :unique-opened="true" router :default-active="$route.path" @select="handleSelect"> <div class="user-menu-box" v-for="menu in menus" :key="menu.

  • WordPress免插件实现面包屑导航的示例代码

    你如果在开发自己的wordpress主题,想加入面包屑导航,而又不想使用插件的话,下面的代码对你有帮助,这里提供了网上较为流行的两种代码,一是功能非常完善的,一是一个较为简洁的代码. 前面介绍了一种方法,你也可以尝试一下,在文末给大家详细介绍了自定义函数实现wordpress面包屑导航的代码,可以点击查看下. 功能非常完善代码 1.将下面的代码添加到主题的 functions.php : /** * WordPress 添加面包屑导航 * http://www.511yj.com/wordpre

  • vue.js实现动态面包屑

    最近在学习vue,正好手上有个项目还是用jquery写的,就自己尝试将这个项目的前端用vue实现,途中遇到了动态面包屑的问题,特此记录一下,如有不对的地方,欢迎指正. 需求描述: 点击左侧的导航,跳转到不同的页面,并且根据导航的路径,动态生成面包屑.面包屑的数据均来自于左侧的导航. 思路: 1.面包屑作为一个单独的组件,在页面中引入.页面的结构如下: <template>     <div class="page-center">         <top

  • 为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置

    公司项目的面包屑导航是使用 element 的面包屑组件,配合一份 json 配置文件来实现的,每次写新页面都需要去写 json 配置,非常麻烦,所以写一个面包屑cli,自动生成页面.自动配置面包屑数据,提高效率:rocket: 明确目标 提供 init 命令,在一个新项目中能够通过初始化生成面包屑相关文件 能够通过命令生成页面,并且自动配置面包屑 json 数据 按照项目原有需求,能够配置面包屑是否可点击跳转 按照项目原有需求,能够配置某路径下是否展示面包屑 支持仅配置而不生成文件,能够为已存

  • vue 使用localstorage实现面包屑的操作

    mutation.js代码: changeRoute(state, val) { let routeList = state.routeList; let isFind = false; let findeIdex = 0; //菜单栏和下拉的二级菜单 if (val['type'] == 'header' || val['type'] == 'secondHeader') { routeList.length = 0; //顶级菜单清除缓存 localStorage.removeItem("r

  • vue动态路由实现多级嵌套面包屑的思路与方法

    前言 最近在工作中遇到了一个问题,是关于vue动态路由多级嵌套面包屑怎么弄(不是动态路由嵌套可以尝试用 this.$route.matched方法获取到path和name集合,动态的嵌套获取不到全部具体的id) 功能比如:A列表页面路由如/a,点击任意一列进入任意一个A的详情页面名字为B,/b/03(这个是动态路由弄是吧,03就是id嘛),点击B页面任意一列,再进入B的详情页名字为C,路由如/bdetail/01;现在弄面包屑要获取到的路由是刚刚打开的,如(/a:/b/03:/bdetail/0

随机推荐