【实现】Vue主页侧边栏

效果展示

在这里插入图片描述

使用技术

Vue+Element UI

代码部分
1 整体布局

整体布局源于Element UI 中给的样例,点击进入
在这里插入图片描述

基础框架代码

<el-container>
  <el-header>Header</el-header>
  <el-container>
    <el-aside width="200px">Aside</el-aside>
    <el-main>Main</el-main>
  </el-container>
</el-container>
头部内容代码和样式
<el-header>
<!--      logo和项目名称-->
      <div class="left_box">
        <img src="../assets/img/school.png">
        <span>学院信息管理系统</span>
      </div>
<!--      登录用户头像-->
      <div class="right_box">
        <el-dropdown >
          <img src="../assets/img/bixin.gif">
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item icon="el-icon-house">系统首页</el-dropdown-item>
            <el-dropdown-item icon="el-icon-ship">交流讨论</el-dropdown-item>
            <el-dropdown-item icon="el-icon-switch-button">退出登录</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>

      </div>
    </el-header>

/* 头部布局*/
.el-header{
  background-color: #001529;
  color: #FFFFFF;
  display: flex;
  justify-content: space-between;
  padding-left: 0;
  align-items: center; /*文字居中*/
  font-size: 20px;
  /*左边logo 和 标题*/
  .left_box{
    display: flex; /*流式布局 */
    align-items: center;
    /*logo*/
    img{
      width: 60px;
      height: 60px;
      margin: 0px 0px 10px 10px ; /*上下左右*/
    }
    /*标题*/
    span{
      margin-left: 15px;
    }
  }
  /*右边的登录头像*/
  .right_box{
    .el-dropdown>img{
      width: 60px;
      height: 60px;
      border-radius: 50%;
      background-color: #FFFFFF;
      padding-left: 5px;
      margin: 0px 15px 0px 0px;
      background-size: contain;
    }
  }
}
侧边栏内容和样式
<!--      侧边栏
el-menu 主菜单
el-submenu 子菜单
el-menu-item 内容项

-->
      <el-aside :width="isCollapse?'60px':'200px'">
<!-- 展开/收起 -->
        <div class="toggle_box" @click="toggleCollapse">|||</div>
        <el-menu
          default-active="2"
          class="el-menu-vertical-demo"
          @open="handleOpen"
          @close="handleClose"
          background-color="#001529"
          text-color="#fff"
          active-text-color="#ffd04b"
        :collapse="isCollapse"
        :collapse-transition="false"
        :unique-opened="true"
        :router="true">
        <!-- 该部分是用了外部的组件 防止菜单栏的选项过于多 -->
<MenuTree :menuList="this.MenuList"></MenuTree>
        </el-menu>
      </el-aside>

Script部分代码


import MenuTree from '../components/MenuTree'
export default {
  name: 'Main',
  data() {
    return {
      isCollapse: false,
      <!-- 这是一段与侧边栏相关的Json-->
     MenuList: [
        {
          "id": 1,
          "parentId": 0,
          "menuName": "系统管理",
          "url": "",
          "icon": "el-icon-setting",
          "orderNum": 1,
          "open": 1,
          "disabled": false,
          "perms": null,
          "type": 0,
          "children": [
            {
              "id": 253,
              "parentId": 1,
              "menuName": "欢迎页面",
              "url": "/welcome",
              "icon": "el-icon-star-off",
              "orderNum": 1,
              "open": 0,
              "disabled": false,
              "perms": "welcome:view",
              "type": 0,
              "children": []
            },
            ..
             {
              "id": 307,
              "parentId": 5,
              "menuName": "操作日志",
              "url": "/logs",
              "icon": "el-icon-edit",
              "orderNum": 1,
              "open": 1,
              "disabled": false,
              "perms": "",
              "type": 0,
              "children": []
            }
          ]
        }
      ],
    }
  },
  components:{
    MenuTree
  },
  methods:{
    toggleCollapse(){
      this.isCollapse = (!this.isCollapse);
    }
  }
}
</script>

在components文件夹,创建侧边栏组件
在这里插入图片描述

/*
改部分主要是针对Json文件中的内容进行遍历 显示,可以实现测边框内容的自定义
*/
<template>
  <div>
  /* 遍历 json文件 */
    <template v-for="item in this.menuList">
    /* 根据Json文件判断 如果有子目录,则调用该部分 */
      <el-submenu :disabled="item.disabled" :index="item.id+''" :key="item.id+''" v-if="item.children.length>0">
        <template slot="title">
          <i :class="item.icon"></i>
          <span>{{ item.menuName }}</span>
        </template>
        <MenuTree :menu-list="item.children"></MenuTree>
      </el-submenu>
        /* 根据Json文件判断 如果没有子目录,则调用该部分 */
      <el-menu-item
        v-else
        :disabled="item.disabled"
        :index="item.url+''"
        :route="item.url+''"
        @click="savePath(item.url)"
        :key="item.id"
        style="padding-left: 50px;"
      >
        <i :class="item.icon"></i>
        <span slot="title">{{ item.menuName }}</span>
      </el-menu-item>
    </template>
  </div>
</template>

<script>
export default {
  name: 'MenuTree',
  props: ['menuList'],
}
</script>
<!-- 这个主要是为了防止在 Main.Vue中的显示问题 -->
<style lang="less" scoped>
/*实现了溢出处理*/
.el-menu--collapse span,
.el-menu--collapse i.el-submenu__icon-arrow {
  height: 0;
  width: 0;
  overflow: hidden;/* (如果没有该句,在页面上会出现多余部分)*/
  visibility: hidden;
  display: inline-block;
}
</style>

<script>
export default {
  name: "MenuTree", //模板名称
  data() {
    return {};
  },
  beforeMount() {},
  props: ["menuList"],
  methods:{
    //保存激活路径
    savePath(path) {
      window.sessionStorage.setItem("activePath", path);
      this.activePath = path;
    },
  },
  created(){}
};
</script>
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一个流行的JavaScript框架,可以用于构建Web应用程序。要实现侧边手风琴效果,可以使用Vue的transition组件来实现动画效果,以及vue-router来管理路由。 下面是一个简单的侧边手风琴效果的代码示例: ``` <template> <div class="sidebar"> <ul> <li v-for="(item, index) in menuItems" :key="index" :class="{ active: activeIndex === index }" @click="toggleItem(index)"> <div class="title">{{ item.title }}</div> <transition name="slide"> <ul v-show="activeIndex === index"> <li v-for="(subItem, subIndex) in item.subItems" :key="subIndex">{{ subItem }}</li> </ul> </transition> </li> </ul> </div> </template> <script> export default { data() { return { menuItems: [ { title: '菜单1', subItems: ['子菜单1', '子菜单2', '子菜单3'] }, { title: '菜单2', subItems: ['子菜单4', '子菜单5', '子菜单6'] }, { title: '菜单3', subItems: ['子菜单7', '子菜单8', '子菜单9'] }, ], activeIndex: null, }; }, methods: { toggleItem(index) { if (this.activeIndex === index) { this.activeIndex = null; } else { this.activeIndex = index; } }, }, }; </script> <style scoped> .sidebar { width: 200px; } .title { cursor: pointer; } ul { list-style: none; padding: 0; } li { border-bottom: 1px solid #ddd; } .active .title { background-color: #ddd; } .slide-enter-active, .slide-leave-active { transition: all 0.3s ease-out; } .slide-enter, .slide-leave-to { height: 0; overflow: hidden; } </style> ``` 在这个示例中,我们使用了一个包含菜单项和子菜单项的数组来生成侧边。我们使用v-for指令来循环渲染每个菜单项,并使用v-show指令根据当前激活的索引来显示或隐藏子菜单项。我们还使用了Vue的transition组件来添加动画效果,并通过activeIndex来跟踪当前激活的菜单项。 希望这可以帮助您了解如何使用Vue实现侧边手风琴效果!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值