Vue-router 结合 element-ui 制作动态导航栏 + 面包屑

效果图如下:
动态导航栏 + 面包屑

主要思路:
一开始我的想法是根据左侧导航栏的点击事件动态的改变上方的面包屑,但后来发现如果直接通过 URL 访问的话导航栏和面包屑都是处于初始状态的。因此我想到通过 router 的值同时改变导航栏和面包屑。

首先,我们定义 router 文件,注意将 Router 的模式设为 history,否则跳转时 URL 上会带有 # 符号,导致获取到的 route 值不正确,代码如下:

router.ts

import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);

export default new Router({
    mode: 'history',
    routes: [
        {
            path: '/',
            name: 'home',
            component: () => import('./views/Home.vue'),
        },
        {
            name: '1',
            path: ':id',
            component: () => import('./views/Component1.vue'),
            children: [
                {
                    path: '/1-1',
                    name: '1-1',
                    component: () => import('./views/Component1-1.vue'),
                },
                {
                    path: '/1-2',
                    name: '1-2',
                    component: () => import('./views/Component1-1.vue'),
                },
                {
                    path: '/1-3',
                    name: '1-3',
                    component: () => import('./views/Component1-1.vue'),
                },
            ],
        },
    ],
});

导航栏我使用的是 el-menu 组件,它有一个属性是 default-active,结合 el-submenu 定义的 index 属性,可以很方便的与 route 同步,代码如下:

NavMenu.vue

<template>
<div class="container">
    <el-row class="container">
        <el-col :span="24" class="container">
            <el-menu :router=true :default-active="$route.name" class="el-menu-vertical-demo container">
                <el-submenu index="1">
                    <template slot="title">
                        <span>title1</span>
                    </template>
                    <el-menu-item index="1-1">title1-1</el-menu-item>
                    <el-menu-item index="1-2">title1-2</el-menu-item>
                    <el-menu-item index="1-3">title1-3</el-menu-item>
                </el-submenu>
            </el-menu>
        </el-col>
    </el-row>
</div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class NavMenu extends Vue {}
</script>

面包屑使用的是 el-breadcrumb 组件,为了与 route 同步,需要 watch $route 的值,$route.matched 得到的是一个数组,刚好可以处理后得到面包屑的标题的数组,代码如下:

BreadCrumb.vue

<template>
<div>
    <el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
        <el-breadcrumb-item><a href="/">首页</a></el-breadcrumb-item>
        <el-breadcrumb-item v-for="bread in breadList" v-bind:key="bread">
            {{ breadsName[bread] }}
        </el-breadcrumb-item>
    </el-breadcrumb>
</div>
</template>

<script lang="ts">
import { Provide, Component, Watch, Prop, Vue } from 'vue-property-decorator';

@Component
export default class BreadCrumb extends Vue {
    @Provide() private breadsName: { [index: string]: string } = {
        '1': 'title1',
        '1-1': 'title1-1',
        '1-2': 'title1-2',
        '1-3': 'title1-3',
    };

    @Provide() private breadList: string[] = [];

    private created() {
        this.getBreadList();
    }

    @Watch('$route')
    private getBreadList() {
        this.breadList = [];
        for (const routeInfo of this.$route.matched) {
            if (typeof routeInfo.name === 'string' && routeInfo.name !== 'home') {
                this.breadList.push(routeInfo.name);
            }
        }
    }
}
</script>

<style lang="less">
.breadcrumb {
    margin-bottom: 20px;
}
</style>

两个组件完成后,我们需要把它们引入到主页面中,代码如下:

App.vue

<template>
<div id="app">
    <el-container class="container" >

        <el-container class="container">
            <el-aside class="aside">
                <NavMenu/>
            </el-aside>

            <el-main class="main">
                <BreadCrumb/>
                <router-view/>
            </el-main>
        </el-container>
    </el-container>
</div>
</template>

<script lang="ts">
import Vue from 'vue';
import { Provide, Component } from 'vue-property-decorator';
import NavMenu from '@/components/NavMenu.vue';
import BreadCrumb from '@/components/BreadCrumb.vue';

@Component({
  components: {
    NavMenu, BreadCrumb,
  },
})
export default class App extends Vue {}
</script>

<style lang="less">
* {
    padding: 0;
    margin: 0;
}
html,
body {
    height: 100%;
}

#app {
    height: 100%;
}

.container {
    height: 100%;
}

.aside {
    height: 100%;
    width: 15%;
    min-width: 200px;
    max-width: 240px;
}
</style>

需要注意的是,即使层级1是没有页面的,但是层级1-1的组件是渲染到层级1的组件中的,一开始我没有创建 Component1 这个组件,只在 APP.vue 添加了 <router-view/> 发现渲染不出组件 Component1-1

这两个组件的内容如下,需要自己填充其他内容。

Component1.vue

<template>
<div>
    <router-view/>
</div>
</template>

Component1-1.vue

<template>
  <div>
    <h1>This is a page</h1>
  </div>
</template>
  • 11
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
易购商城是一个基于Vue框架开发的前端毕设项目。在该项目中,我使用了Vue、Vuex、Vue Router、Element UI、Axios等技术和库来实现各种功能。 首先,Vue是一种流行的前端框架,它具有响应式的数据绑定和组件化的特性,使得开发者可以轻松构建交互性强、高效的单页面应用。 其次,我使用了Vuex来管理应用的状态。Vuex提供了一种集中式的状态管理方案,帮助我管理和共享全局的数据,使得不同组件之间的通信更加便捷。 Vue Router是Vue官方提供的路由管理库,用于实现页面之间的导航和路由跳转。我使用它来定义和管理不同页面之间的跳转逻辑,使得用户可以通过URL来访问和导航各个页面。 Element UI是一套基于Vue的桌面端组件库,它提供了丰富的UI组件和样式,使得我可以快速构建出美观和功能完善的界面。 为了与后端进行数据交互,我使用了Axios库。Axios是一个基于Promise的HTTP客户端,可以在前端与后端进行异步数据交互,使得用户可以实现登录、注册、添加购物车、结算等功能。 最后,我还使用了Vue插件vue-echarts和vue-awesome-swiper来实现商品数据的可视化展示和轮播图功能。这些插件都提供了强大且易用的功能,使得易购商城的用户界面更加丰富和吸引人。 总体来说,通过使用Vue、Vuex、Vue Router、Element UI、Axios等技术和库,我成功地实现了易购商城的前端开发工作,提供了丰富的功能和良好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值