【Vue2+Element ui通用后台】左侧菜单实现

news2024/11/20 3:26:58

文章目录

  • 主体布局搭建
  • 左侧菜单搭建
  • 左侧菜单跳转

主体布局搭建

我们在 Container 布局容器,找到有左侧、头部、和主体部分的布局,直接复制代码到 Main.vue 中:

<template>
  <div>
    <el-container>
      <el-aside width="200px">Aside</el-aside>
      <el-container>
        <el-header>Header</el-header>
        <el-main><router-view></router-view></el-main>
      </el-container>
    </el-container>
  </div>
</template>

在这里插入图片描述

左侧菜单搭建

在导航菜单中找到我们需要的直接复制示例代码到项目中即可

我们在 components 中新建 CommonAside.vue ,做为左侧菜单的组件,把复制的代码放进去

<template>
  <div class="hello">
    <el-menu
        default-active="2"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
        background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b">
      <el-submenu index="1">
        <template slot="title">
          <i class="el-icon-location"></i>
          <span>导航一</span>
        </template>
        <el-menu-item-group>
          <template slot="title">分组一</template>
          <el-menu-item index="1-1">选项1</el-menu-item>
          <el-menu-item index="1-2">选项2</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="分组2">
          <el-menu-item index="1-3">选项3</el-menu-item>
        </el-menu-item-group>
        <el-submenu index="1-4">
          <template slot="title">选项4</template>
          <el-menu-item index="1-4-1">选项1</el-menu-item>
        </el-submenu>
      </el-submenu>
      <el-menu-item index="2">
        <i class="el-icon-menu"></i>
        <span slot="title">导航二</span>
      </el-menu-item>
      <el-menu-item index="3" disabled>
        <i class="el-icon-document"></i>
        <span slot="title">导航三</span>
      </el-menu-item>
      <el-menu-item index="4">
        <i class="el-icon-setting"></i>
        <span slot="title">导航四</span>
      </el-menu-item>
    </el-menu>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCollapse: true
    };
  },
  methods: {
    handleOpen(key, keyPath) {
      console.log(key, keyPath);
    },
    handleClose(key, keyPath) {
      console.log(key, keyPath);
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}
</style>


然后在 Main.vue 中引入组件

<template>
  <div>
    <el-container>
      <el-aside width="200px">
        <CommonAside />
      </el-aside>
      <el-container>
        <el-header>Header</el-header>
        <el-main><router-view></router-view></el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>
import CommonAside from "@/components/CommonAside";
export default {
  name: "Main",
  components:{
    CommonAside
  }
}
</script>

<style scoped>

</style>

运行项目现在的样式:
在这里插入图片描述
我们修改默认代码,使用 for 循环动态渲染成我们所需要的导航数据:

<template>
  <div class="hello">
    <el-menu
        default-active="2"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
        background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b">

      <el-menu-item v-for="item in noChildren" :key="item.name" :index="item.name">
        <i :class="`el-icon-${item.icon}`"></i>
        <span slot="title">{{item.label}}</span>
      </el-menu-item>

      <el-submenu v-for="item in hasChildren" :key="item.name" :index="item.name">
        <template slot="title">
          <i :class="`el-icon-${item.icon}`"></i>
          <span>{{item.label}}</span>
        </template>
        <el-menu-item-group v-for="subItem in item.children" :key="subItem.name">
          <el-menu-item :index="subItem.name">{{subItem.label}}</el-menu-item>
        </el-menu-item-group>
      </el-submenu>
    </el-menu>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCollapse: true,
      menuData: [
        {
          path: '/',
          name: 'home',
          label: '首页',
          icon: 's-home',
          url: 'Home/home'
        },
        {
          path: '/mall',
          name: 'mall',
          label: '商品管理',
          icon: 'video-play',
          url: 'MallManage/MallManager'
        },
        {
          path: '/user',
          name: 'user',
          label: '用户管理',
          icon: 'user',
          url: 'UserManage/UserManager'
        },
        {
          label: '其他',
          icon: 'location',
          name: 'other',
          children:[
            {
              path: '/page1',
              name: 'page1',
              label: '页面1',
              icon: 'setting',
              url: 'Other/PageOne'
            },
            {
              path: '/page2',
              name: 'page2',
              label: '页面2',
              icon: 'setting',
              url: 'Other/PageTwo'
            }
          ]
        },

      ]
    };
  },
  methods: {
    handleOpen(key, keyPath) {
      console.log(key, keyPath);
    },
    handleClose(key, keyPath) {
      console.log(key, keyPath);
    }
  },
  computed:{
    // 没有子菜单
    noChildren(){
      return this.menuData.filter(item => !item.children)
    },
    // 有子菜单
    hasChildren(){
      return this.menuData.filter(item => item.children)
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}
</style>

运行程序:
在这里插入图片描述

对代码进行分析:我们使用计算属性分为有子菜单和没有子菜单的两部分,然后分别遍历

我们用到了图标:Icon,使用方法就是在 <i> 中使用对应 class 即可,我们观察到图标的前边都是一样的,所以我们使用 ES6的模板语法,只改变后边的名称即可
在这里插入图片描述
由于我们需要修改左侧菜单的样式,我们可以使用 less(less官方文档),我们需要先下载安装执行npm i less@4.1.2

还需要安装npm i less-loader@6.0.0

之后修改 CommonAside.vue 中代码,增加一个标题,然后修改样式如下:

<template>
  <div class="hello">
    <el-menu
        default-active="2"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
        background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b">
      <h3>通用后台管理</h3>
      ......
    </el-menu>
  </div>
</template>

<script>
......
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}
.el-menu{
  height: 100vh;
  h3{
        color: #fff;
	    text-align: center;
    	line-height: 48px;
    	font-size: 16px;
   	 	font-weight: 400;
  }
}
</style>

现在样式是这样的,左边有默认的边距,所以需要修改 App.vue 去掉边距

<template>
  <div id="app">
    <!-- 路由出口 -->
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view></router-view>
  </div>
</template>

<script>
</script>

<style lang="less">
html,body,h3{
  margin: 0;
  padding: 0;
}
</style>

运行效果如下:
在这里插入图片描述

左侧菜单跳转

在 CommonAside 中我们的菜单数据中已经有了跳转路径,我们需要加到 index.js 中

这里的 path 就复制 CommonAside 中对应菜单的 path 即可

import Vue from 'vue'
......

//1、创建组件
import Home from '../views/Home';
import User from '../views/User';
import Main from '../views/Main';
import Mall from '../views/Mall';
import PageOne from '../views/PageOne';
import PageTwo from '../views/PageTwo';
//2、将路由与组件进行映射
const routes = [
    {
        //主路由
        path: '/',
        component: Main,
        children: [
            { path: 'home', component: Home },// 主页
            { path: 'user', component: User },// 用户管理
            { path: 'mall', component: Mall },// 商品管理
            { path: 'page1', component: PageOne },// 页面1
            { path: 'page2', component: PageTwo },// 页面2
        ]
    }
]
//3、创建router实例
......


这样当我们在浏览器地址栏修改地址时,页面就会展示对应的页面了

在这里插入图片描述
下面完成点击左侧菜单进行跳转,所以需要给菜单添加 click 事件,传入点击的菜单的数据,使用 router 进行跳转

<template>
  <div class="hello">
    <el-menu
        default-active="2"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
        background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b">
      <h3>通用后台管理</h3>
      <el-menu-item v-for="item in noChildren" :key="item.name" :index="item.name" @click="menuClick(item)">
        <i :class="`el-icon-${item.icon}`"></i>
        <span slot="title">{{item.label}}</span>
      </el-menu-item>

      <el-submenu v-for="item in hasChildren" :key="item.name" :index="item.name">
        <template slot="title">
          <i :class="`el-icon-${item.icon}`"></i>
          <span>{{item.label}}</span>
        </template>
        <el-menu-item-group v-for="subItem in item.children" :key="subItem.name">
          <el-menu-item :index="subItem.name">{{subItem.label}}</el-menu-item>
        </el-menu-item-group>
      </el-submenu>
    </el-menu>
  </div>
</template>

<script>
export default {
  ......
  methods: {
    ......
    menuClick(item) {
      this.$router.push(item.path)
    }
  },
  ......
}
</script>

index.js 中需要增加redirect:'/home',这样当以为首页的路径是 /,当点击时需要重定向到 home 页面

const routes = [
    {
        //主路由
        path: '/',
        component: Main,
        redirect:'/home',
        children: [
            { path: 'home', component: Home },// 主页
            { path: 'user', component: User },// 用户管理
            { path: 'mall', component: Mall },// 商品管理
            { path: 'page1', component: PageOne },// 页面1
            { path: 'page2', component: PageTwo },// 页面2
        ]
    }
]

在这里插入图片描述
然后我们解决一个问题,当我们已经点击了商品管理时,当再次点击一次商品管理时会报错,这是因为 router 限制了我们不能重复跳转,如果重复跳转就会有这个提示
在这里插入图片描述
所以我们需要在跳转时进行判断,如果需要跳转的路径和当前路径相同就不进行跳转

menuClick(item) {
      // 当页面的路由与跳转的路由不一致才进行跳转
      if(this.$route.path !== item.path && !(this.$route.path === '/home' && item.path === '/')){
        this.$router.push(item.path)
      }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「从零入门推荐系统」06:推荐系统召回算法介绍

作者 | gongyouliu编辑 | gongyouliu我们在前面几章中介绍了推荐系统的一些基本概念&#xff0c;从本章开始我们会进入推荐系统的核心章节&#xff0c;也就是关于推荐算法部分的介绍。我们在第五章「推荐系统业务流程与架构」中讲到推荐系统一般会分为召回和排序两个阶段&#…

ADI Blackfin DSP处理器-BF533的开发详解38:图像处理专题-Sobel 算子边缘检测(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了 Sobel 算子的图像边缘检测&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"…

Java集合和常见数据结构以及泛型

Java集合和常见数据结构以及泛型集合概述Collection集合的体系特点Collection集合常用APICollection集合的遍历方式方法一&#xff1a;迭代器方法二&#xff1a;foreach/增强for循环方法三&#xff1a;lambda表达式Collection集合存储自定义类型的对象常见数据结构数据结构概述…

PDF格式如何转成Excel?这篇文章教会你如何转换

不知道在日常的办公中&#xff0c;大家有没有碰到过这样一个问题&#xff1a;当领导给你发个PDF文件后&#xff0c;要求你尽快的将PDF文件中的表格数据进行修改&#xff0c;但当你把PDF转换成Excel格式后&#xff0c;发现转换后的文件排版格式错乱的。可是截止时间的压迫和乱七…

[附源码]Python计算机毕业设计大学生日常行为评分管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Python输出文字改变颜色

# Python输出文字改变颜色的方法 一、使用注释性输出 &#xff08;一&#xff09;、基本语法 \033[显示方式; 前景色; 背景色m******\033[0m 显示方式、前景色、背景色都为可选参数&#xff0c;选择自己需要的即可&#xff0c;而且顺序可变非固定&#xff0c;但建议按照默认顺…

Openlayers 自定义投影坐标系数据转换以及在线转换工具

Openlayers 自定义投影坐标系数据转换以及在线转换工具OpenLayers 教程查看 EPSG 码和定义Openlayers 自定义投影坐标系数据转换以及在线转换工具在线示例OpenLayers 教程 工作中经常会遇到转换坐标的情况&#xff0c;一般都会写代码搞定&#xff0c;但是有时候只需要查看一下…

web前端期末大作业:基于HTML+CSS+JavaScript汽车租赁网站(47页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

ELK 企业级日志分析系统

一、ELK 概述 1、ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ●ElasticSearch&#xff1a;是基于Lucene&#xff08;一个全文检…

[附源码]Python计算机毕业设计Django安防管理平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

CleanMyMacX软件怎么样?实际使用效果功能讲解

如果你也对MAC系统的优化和文件管理摸不清头脑&#xff0c;不知道该如何清理垃圾和缓存文件。那你可以试试我最近发现的这款软件——CleanMyMac X。 这是一款MAC OS的老牌清理软件&#xff0c;集系统的清理、提速、保护和软件的卸载于一体,由知名软件开发商MACPaw开发&#xf…

未来五年,人类和数字化劳动力混合的员工队伍将变得非常普遍

从机器管家安德鲁&#xff0c;到钢铁侠的贾维斯&#xff0c;无论是实体智能机器人&#xff0c;还是人工智能系统&#xff0c;人们对于机器人助手的想象从未停止过。 虽然&#xff0c;人类和机器人助手一起工作&#xff0c;听上去很科幻&#xff0c;但这一情况如今已比想象的更…

SpringBoot整合邮件服务(QQ邮箱)

文章目录SpringBoot整合邮件服务配置选择账户点击开启SMTP服务&#xff1a;发送短信&#xff1a;发送完&#xff0c;点击我已发送&#xff0c;然后得到密码&#xff1a;POM依赖&#xff1a;application.ymlJava集成EmailService在controller里定义接口&#xff1a;在业务实现层…

继承——C++第二大特性

目录 一、概念及定义 1、概念 2、定义 &#xff08;2&#xff09;方式 &#xff08;3&#xff09;继承基类成员访问方式的变化 二、父类子类赋值转换 三、继承中的作用域 四、派生类的默认成员函数 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、归纳 一、…

C语言——每周刷题题集(第一周)

前言 做题可以更好地巩固所学知识&#xff0c;并加深对于知识点的理解。下面题目均来自牛客网入门编程练习题。 第一题: BC8 十六进制转十进制 描述&#xff1a; BoBo写了一个十六进制整数ABCDEF&#xff0c;他问KiKi对应的十进制整数是多少。 输入描述&#xff1a; 无 …

基于自注意力的生成对抗归因网络的交通流缺失数据修复

文章信息《Missing Data Repairs for Traffic Flow With Self-Attention Generative Adversarial Imputation Net》是2022年7月发表在期刊IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTA TION SYSTEMS上的一篇文章。摘要随着传感器技术的快速发展&#xff0c;由多个空间分布的传…

2023我为什么建议你学Python?

前言 最近有一位读者准备实习开始找工作&#xff0c;来跟我交流他目前找工作遇到的一些情况&#xff1a; “我被找工作弄得满头包&#xff0c;觉得好像自己学的专业很没有市场&#xff0c;也没有很好的大公司背书&#xff0c;根本没有和 HR 谈薪资的底气。 他最近撒简历发现…

Java IO流

一、IO的概念 Java IO&#xff1a;Java IO即Java 输入输出系统。不管我们编写何种应用&#xff0c;都难免和各种输入输出相关的媒介打交道&#xff0c;其实和媒介进行IO的过程是十分复杂的&#xff0c;这要考虑的因素特别多&#xff0c;比如我们要考虑和哪种媒介进行IO&#x…

react进阶用法完全指南

React调用回调函数&#xff0c;正确设置this指向的三种方法 通过bind this.increment this.increment.bind(this);通过箭头函数 <button onClick{this.multi}>点我*10</button> multi () > {this.setState({count: this.state.count * 10}) }箭头函数包裹 …

[附源码]Python计算机毕业设计大学生学科竞赛管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…