面包屑实现动态与静态看需求咯
如下所示:
面包屑
one方法 1
面包屑点击title显示进行替换(不可点击)
面包屑点击title显示进行替换(不可点击)
这种根据路由的meta值来判断
涉及2个页面
1 router.js
2 面包屑独立文件
效果图
router.js
在这里的name下都要加入
meta: { title: '' },
面包屑独立文件
直接copy用
!<template>
<!-- 常见的面包屑 -->
<div>
<el-breadcrumb eparator="/">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item v-for="(item, index) in breadList" :key="index">{{item.meta.title}}</el-breadcrumb-item>
</el-breadcrumb>
</div>
</template>
<script>
export default {
data(){
return{
breadList: []
}
},
watch:{
$route(val) {
this.getBreadcrumb(val);
}
},
methods: {
getBreadcrumb(val) {
if (val.matched) {
let matched = val.matched.filter(item => item.meta && item.meta.title);
this.breadList = matched;
}
}
}
}
</script>
<style>
</style>
two方法 2
面包屑点击title显示进行叠加(可点击)
面包屑点击title显示进行叠加(可点击)
触及到文件
1 router.js
2 store.js
3 面包屑文件(放在首页里面)
4 侧边栏独立文件
效果图
router.js
路由文件
这里对应的路由的各个name需要与侧边栏对应写的你name保持一致
store.js
这个是vuex里使用的文件
这里的是tab.js做了拆分如下所示
里面内容所示
这里的内容可以直接copy
export default {
state:{
tabList:[
// 拿到首页的数据初始化显示home
{
id: 1,
path: "/index",
name: "AdminIndex",
//这里的name值与router的保持一致
nameZh: "首页",
icon: "el-icon-menu",
component: "AdminIndex",
},
],
currentMenu: null//初始化侧边栏的值为null
},
mutations:{
// 判断选中的值状态
selectMenu(state,val){
if(val.name !== 'AdminIndex'){//对应的title的name
state.currentMenu = val
// 查找选中的是否索引值一致 进行单个添加
const result = state.tabList.findIndex(item => item.name === val.name)
if(result === -1){
state.tabList.push(val)
}
}else{
state.collapseMenu = null
}
},
// 判断关闭的状态
closeTag(state,val){
// 查找选中的是否索引值一致 进行单个删除
const result = state.tabList.findIndex(item => item.name === val.name )
state.tabList.splice(result, 1)
}
},
}
面包屑文件
//html
<el-breadcrumb separator="/">
<el-breadcrumb-item
v-for="item in tags"
:key="item.path"
:to="{ path: item.path }"
>{{ item.nameZh }}</el-breadcrumb-item>
//js
import { mapState } from "vuex";
computed: {
...mapState({
tags: (state) => state.tab.tabList,
}),
},
就可
侧边栏独立文件
需要在如下所示加入点击事件
我这里的侧边栏使用递归只需要在子里面加入这个点击事件
//然后点击事件里面的方法写这种
methods: {
clickMenu(item) {
console.log(item)
this.$router.push({
name: item.name
})
this.$store.commit('selectMenu', item)
}
},
three方法 3
面包屑点击title显示进行叠加带删除(可点击)
面包屑点击title显示进行叠加带删除(可点击)
这种根据路由的name相同来判断
触及到文件
1 router.js
2 store.js
3 面包屑独立文件
4 侧边栏独立文件
效果图
router.js
路由文件
这里对应的路由的各个name需要与侧边栏对应写的你name保持一致
store.js
这个是vuex里使用的文件
这里的是tab.js做了拆分如下所示
里面内容所示
这里的内容可以直接copy
export default {
state:{
tabList:[
// 拿到首页的数据初始化显示home
{
id: 1,
path: "/index",
name: "AdminIndex",
//这里的name值与router的保持一致
nameZh: "首页",
icon: "el-icon-menu",
component: "AdminIndex",
},
],
currentMenu: null//初始化侧边栏的值为null
},
mutations:{
// 判断选中的值状态
selectMenu(state,val){
if(val.name !== 'AdminIndex'){//对应的title的name
state.currentMenu = val
// 查找选中的是否索引值一致 进行单个添加
const result = state.tabList.findIndex(item => item.name === val.name)
if(result === -1){
state.tabList.push(val)
}
}else{
state.collapseMenu = null
}
},
// 判断关闭的状态
closeTag(state,val){
// 查找选中的是否索引值一致 进行单个删除
const result = state.tabList.findIndex(item => item.name === val.name )
state.tabList.splice(result, 1)
}
},
}
面包屑独立文件
这里我们独立开一个文件 然后在首页的header里面引入
里面内容如下
<template>
<div class="tabs">
<el-tag
v-for="(tag, index) in tags"
:key="tag.name"
type="danger"
:closable="tag.name !== 'AdminIndex'"
:effect="$route.name === tag.name ? 'dark' : 'plain'"
@click="changeMenu(tag)"
@close="handleClose(tag, index)"
size="small">
{{ tag.nameZh }}
</el-tag>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
export default {
name: 'CommonTag',
data () {
return {
}
},
methods: {
...mapMutations({
close: 'closeTag'
}),
changeMenu(item) {
this.$router.push({
name: item.name
})
},
handleClose(tag, index) {
const length = this.tags.length - 1
this.close(tag)
if (tag.name !== this.$route.name) {
return;
}
if (index === length) {
this.$router.push({
name: this.tags[index - 1].name
})
} else {
this.$router.push({
name: this.tags[index].name
})
}
}
},
computed: {
...mapState({
tags: state => state.tab.tabList//默认显示首页
})
}
}
</script>
<style scoped>
.tabs {
padding:5px 10px;
text-align: left;
margin: -14px -20px 10px -20px;
background-color: #fff;
}
.tabs .el-tag {
margin-right: 10px;
cursor: pointer;
}
</style>
侧边栏独立文件
需要在如下所示加入点击事件
我这里的侧边栏使用递归只需要在子里面加入这个点击事件
//然后点击事件里面的方法写这种
methods: {
clickMenu(item) {
console.log(item)
this.$router.push({
name: item.name
})
this.$store.commit('selectMenu', item)
}
},