Browse Source

修改面包屑组件

pull/54/head
zq 1 week ago
parent
commit
2f75c713d5
  1. BIN
      src/assets/separator.png
  2. 77
      src/components/Breadcrumb copy.vue
  3. 166
      src/components/Breadcrumb.vue
  4. 50
      src/router/index.js

BIN
src/assets/separator.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

77
src/components/Breadcrumb copy.vue

@ -0,0 +1,77 @@
<template>
<el-breadcrumb v-if="showBreadcrumb" separator="/">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbList"
:key="index"
>
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.title }}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</template>
<script>
export default {
data() {
return {
breadcrumbList: [],
showBreadcrumb: false //
};
},
watch: {
$route() {
this.updateBreadcrumb();
}
},
mounted() {
this.updateBreadcrumb();
},
methods: {
updateBreadcrumb() {
const currentPath = this.$route.path;
//
if(!this.$parent.menuData)return
const isSubPage = this.isSubPage(currentPath);
this.showBreadcrumb = isSubPage;
if (isSubPage) {
this.breadcrumbList = this.getBreadcrumbList(currentPath);
} else {
this.breadcrumbList = [];
}
},
isSubPage(path) {
console.log(this.$parent.menuData,'this.$parent.menuData==');
//
for (const menu of this.$parent.menuData) {
for (const subMenu of menu.children) {
if (subMenu.path === path) {
return true;
}
}
}
return false;
},
getBreadcrumbList(path) {
const breadcrumbList = [];
//
for (const menu of this.$parent.menuData) {
for (const subMenu of menu.children) {
if (subMenu.path === path) {
breadcrumbList.push({ title: menu.title, icon: menu.icon });
breadcrumbList.push({ title: subMenu.title });
break;
}
}
}
return breadcrumbList;
}
}
};
</script>
<style scoped>
.el-breadcrumb {
margin-bottom: 20px;
}
</style>

166
src/components/Breadcrumb.vue

@ -1,77 +1,101 @@
<template>
<el-breadcrumb v-if="showBreadcrumb" separator="/">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbList"
:key="index"
>
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.title }}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</template>
<script>
export default {
data() {
return {
breadcrumbList: [],
showBreadcrumb: false //
};
},
watch: {
$route() {
this.updateBreadcrumb();
}
},
mounted() {
this.updateBreadcrumb();
},
methods: {
updateBreadcrumb() {
const currentPath = this.$route.path;
//
if(!this.$parent.menuData)return
const isSubPage = this.isSubPage(currentPath);
this.showBreadcrumb = isSubPage;
if (isSubPage) {
this.breadcrumbList = this.getBreadcrumbList(currentPath);
<div v-if="breadcrumbs.length > 0" class="breadcrumb-container">
<nav>
<ol class="breadcrumb">
<li
v-for="(item, index) in breadcrumbs"
:key="index"
class="breadcrumb-item"
:class="{ active: index === breadcrumbs.length - 1 }"
>
<template v-if="index !== breadcrumbs.length - 1">
<router-link :to="item.path">{{ item.title }}</router-link>
<!-- <span class="separator">/</span> -->
<img class="separator" src="@/assets/separator.png" alt="">
</template>
<template v-else>
<span>{{ item.title }}</span>
</template>
</li>
</ol>
</nav>
</div>
</template>
<script>
export default {
name: 'Breadcrumb',
computed: {
breadcrumbs() {
if (this.$route.meta.hideBreadcrumb) return []
const crumbs = []
let currentRoute = this.$route
//
while (currentRoute) {
crumbs.unshift({
path: currentRoute.path,
title: this.getTitle(currentRoute)
})
// meta.breadcrumbParent
if (currentRoute.meta.breadcrumbParent) {
currentRoute = this.$router.options.routes.find(
r => r.name === currentRoute.meta.breadcrumbParent
)
} else {
this.breadcrumbList = [];
}
},
isSubPage(path) {
console.log(this.$parent.menuData,'this.$parent.menuData==');
//
for (const menu of this.$parent.menuData) {
for (const subMenu of menu.children) {
if (subMenu.path === path) {
return true;
}
}
currentRoute = null
}
return false;
},
getBreadcrumbList(path) {
const breadcrumbList = [];
//
for (const menu of this.$parent.menuData) {
for (const subMenu of menu.children) {
if (subMenu.path === path) {
breadcrumbList.push({ title: menu.title, icon: menu.icon });
breadcrumbList.push({ title: subMenu.title });
break;
}
}
}
return breadcrumbList;
}
return crumbs
}
},
methods: {
getTitle(route) {
return typeof route.meta.title === 'function'
? route.meta.title(route)
: route.meta.title || route.name
}
};
</script>
<style scoped>
.el-breadcrumb {
margin-bottom: 20px;
}
</style>
}
</script>
<style scoped>
/* 保持之前的样式不变 */
.breadcrumb-container {
padding: 16px 12px;
background-color: #f5f5f5;
border-radius: 4px;
}
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: 0;
margin: 0;
list-style: none;
}
.breadcrumb-item {
display: flex;
align-items: center;
}
.breadcrumb-item a {
color: #626573;
text-decoration: none;
}
.breadcrumb-item.active span {
color: #1E2226;;
}
.separator {
/* margin: 0 5px;
color: #6c757d;; */
width: 12px;
height: 12px;
}
</style>

50
src/router/index.js

@ -30,27 +30,17 @@ const routes = [{
path: '/',
name: '首页',
component: HomeView,
// component: Franchise
meta: {
title: '首页',
hideBreadcrumb: true // 首页不显示面包屑
}
},
{
path: '/register',
name: 'register',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import( /* webpackChunkName: "register" */ '../views/Register.vue'),
children: [ // 这是子路由的定义开始
// {
// path: '', // 当访问 /user 时,默认加载 UserProfile 组件
// name: 'register',
// component: Register
// },
// {
// path: 'posts', // 当访问 /user/posts 时,加载 UserPosts 组件
// name: 'UserPosts',
// component: UserPosts,
// }
]
},
{
path: '/ui',
@ -68,22 +58,22 @@ const routes = [{
// which is lazy-loaded when the route is visited.
component: () => import( /* webpackChunkName: "siteList" */ '../views/agent/siteList.vue')
},
{
path: '/agent/siteBaseSetting',
name: '站点基本设置',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import( /* webpackChunkName: "siteList" */ '../views/agent/siteBaseSetting.vue')
},
{
path: '/agent/siteSemSetting',
name: '营销推广',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import( /* webpackChunkName: "siteList" */ '../views/agent/siteSemSetting.vue')
},
// {
// path: '/agent/siteBaseSetting',
// name: '站点基本设置',
// // route level code-splitting
// // this generates a separate chunk (about.[hash].js) for this route
// // which is lazy-loaded when the route is visited.
// component: () => import( /* webpackChunkName: "siteList" */ '../views/agent/siteBaseSetting.vue')
// },
// {
// path: '/agent/siteSemSetting',
// name: '营销推广',
// // route level code-splitting
// // this generates a separate chunk (about.[hash].js) for this route
// // which is lazy-loaded when the route is visited.
// component: () => import( /* webpackChunkName: "siteList" */ '../views/agent/siteSemSetting.vue')
// },
{
path: '/franchise',
name: '加盟',

Loading…
Cancel
Save