前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue从列表页到详情页的面包屑处理方法

vue从列表页到详情页的面包屑处理方法

作者头像
tianyawhl
发布2020-05-19 21:39:39
4.1K0
发布2020-05-19 21:39:39
举报
文章被收录于专栏:前端之攻略前端之攻略

对于菜单级别的面包屑采用的是     this.$route.matched

假如数据结构

代码语言:javascript
复制
[
    {       
        path: "/home",
        name: "商业数据统计",
        component: "Home",
        children:[{         
          path: "/commercial/dataAccount/Day",
          name: "日统计1",
          component: "DataAccountDay"
        },
        {         
          path: "/commercial/dataAccount/Month",
          name: "月统计1",
          component: "DataAccountMonth"
        }]
      },
      {       
        path: "/home",
        name: "商业报表中心",
        component: "Home",
        children:[{         
          path: "/commercial/baobiao/Day",
          name: "日报表1",
          component: "BaobiaoDay"
        }]
      } 
    ]

DataAccountDay组件里面是一个列表,点击列表进入detail.vue页面

如果想实现下面的效果(点击表格的每条记录,名字显示在面包屑的后面),该怎么做呢

原来面包屑的组件 breadcrumb.vue

代码语言:html
复制
<template>
  <div class="margin_b20">
     <el-breadcrumb separator-class="el-icon-arrow-right">
         <el-breadcrumb-item  v-for="(item,index) in breadList" :key="index">
           {{item.name}}
         </el-breadcrumb-item>
     </el-breadcrumb>
  </div>
</template>

<script>
export default {
  name:"Breadcrumb",  
  data(){
    return{
      breadList:[]
    }
  },
  created(){
    this.getBreadList()
  },
  watch:{
    $route(){
      this.getBreadList()
    }
  },
  methods:{
    getBreadList(){
      let matched = this.$route.matched;      
      this.breadList = matched
      console.log(this.breadList)
    }
  }  
};
</script>

<style>

</style>

如果修改其他的组件面包屑同步改变,需要把面包屑的数据放到vuex,方便数据共享

breadcrumb.vue修改为

代码语言:html
复制
<template>
  <div class="margin_b20">   
      <el-breadcrumb-item v-for="(item,key) in breadlist" :key="key">{{item.name}}</el-breadcrumb-item>
    </el-breadcrumb>
  </div>
</template>
<script>
export default {
  name: "Breadcrumb",
  data() {
    return {
      //breadlist: []
    };
  },
  computed:{
    breadlist(){
      return this.$store.state.breadlist
    }
  },
  watch:{
   $route(){   
     this.getBreadcrumb()
   }
  },
  created() {
     console.log("getBreadcrumb")
     this.getBreadcrumb()
  },
  methods: {
    getBreadcrumb(){
      let matched = this.$route.matched      
      // matched 里面的很多数据我们并不需要,放进去如果后面增加的数据键值对不一致会导致错误
      matched = matched.map((item)=>{
        return {name:item.name}
      })
      console.log(matched)
      this.$store.commit("saveBreadList",matched)
    }
  }
};
</script>

<style scoped>
ul {
  list-style-type: none;
  padding: 0;
}

.main-footer {
  border-top: 1px solid #ccc;
  background: #f8fafd;
  padding: 10px;
  margin-left: 0;
}
.main-footer img {
  vertical-align: middle;
  width: 65px;
  margin-right: 10px;
}
</style>

DataAccountDay.vue的按钮

<el-button  @ click = " goDetail ( scope . row ) " > 详情 </el-button>

代码语言:javascript
复制
    goDetail(row){       
       this.$router.push({path:`/industry/dataAccount/Day/${row.id}`})
       let obj={[row.id]:row.name}
       console.log(obj)
       this.$store.commit("saveMapTitle",obj)
    },

从列表点击进入详情页路由配置

代码语言:javascript
复制
  {
    path: '/home', 
    name: "工业数据统计",
    component:Home,
    children:[{
      path:"/industry/dataAccount/Day/:userId",//userId不能与其他的动态路由重名 否则会报错
      name:"日统计",
      component:() => import("../views/dataAccount/detail.vue")
    }]
   
  }

detail.vue

代码语言:html
复制
<template>
  <div>this is detail {{$route.params.userId}}</div>
</template>

<script>
export default {
  data() {
    return {
      table1: {       
        tableData: []
      }
    };
  },
  created() {
   
  },
  computed: {

  }
  },
  watch: {
    
  },
  mounted() {
    console.log("mounted");
     // 一定要使用 this.$nextTick 否则获取不到userID 
     this.$nextTick(() => {
        let userID = this.$route.params.userId;        
        let name = this.$store.state.mapTitle[userID]
        this.$store.commit("addBreadList", { name: name });       
      });
  },

};
</script>

store.js

代码语言:javascript
复制
  state: {
    mapTitle:JSON.parse(sessionStorage.getItem("mapTitle")) || {},    
    breadlist:[],   
  },
代码语言:javascript
复制
  mutations: {
    saveMapTitle(state,mapTitle){     
     state.mapTitle = mapTitle    
     sessionStorage.setItem("mapTitle",JSON.stringify(mapTitle))
    },
    addBreadList(state,newbreadlist){      
     state.breadlist.push(newbreadlist)
    },
    saveBreadList(state,breadlist){
      state.breadlist = breadlist
    }
}

流程

1、点击列表页保存通过this.$route.matched获取的面包屑,同时把点击的id和名字组成一个对象存入vuex中

2、进入详情页通过 this.$route.params.userId 获取name值,并增加到vuex的面包屑对象中,这时面包屑就更新了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档