vue实现多级侧边栏的封装

本文实例为大家分享了vue实现多级侧边栏的封装代码,供大家参考,具体内容如下

父组件

// 左侧导航菜单封装
<template>
  <div class="nav">
    <Menu @handleLink="handleLink" :list="list">
    </Menu>
    <div>{{value}}</div>
  </div>
</template>

<script>
import Menu from '@/components/Menu.vue'
  export default {
    components:{
      Menu
    },
    data(){
      return {
        value: '',
        list: [
          {
            name: '导航1',
            child: [
              {
                name: '选项1',
                child: [
                  {
                    name: '选项1-1',
                    url: 'aaa-1'
                  },
                  {
                    name: '选项2-1',
                    url: 'bbb-1'
                  },
                  {
                    name: '选项3-1',
                    url: 'ccc-1'
                  },
                ]
              },
              {
                name: '选项2',
                url: 'bbb'
              },
              {
                name: '选项3',
                url: 'ccc'
              },
              {
                name: '选项4',
                url: 'ddd'
              },
            ]
          },
          {
            name: '导航2',
            child: [
              {
                name: '选项1',
                url: 'aaa'
              },
              {
                name: '选项2',
                url: 'bbb'
              },
            ]
          },
          {
            name: '导航3',
            url: 'eee'
          },
          {
            name: '导航4',
          }
        ]
      }
    },
    
    methods: {
      handleLink($event,item,index){
        if(item.url){
          this.value = '跳转到' + item.url
        } else {
          if(item.isOpen == undefined){
            this.$set(item,'isOpen', true)
          } else {
            item.isOpen = !item.isOpen
          }
        }
      }
    }
  }
</script>

<style lang="less" scoped>
  *{
    margin: 0;
    padding: 0;
  }
  .nav{
    display: flex;
  }

</style>

子组件

<template>
    <!-- 递归封装多级菜单栏 -->
    <div class="navMenu">
        <div
            v-for="(item, index) in list"
            class="item"
            @click.stop.prevent="handleLink($event, item, index)"
        >
            <div
                class="item-cont"
                :class="{ 'is-disabled': !(item.url || item.child) }"
            >
                {{ item.name }}
                <i class="icon" v-if="item.child"></i>
            </div>
            <div class="list-child" :class="{ active: !item.isOpen }" v-if="item.child">
                <Menu
                    :list="item.child"
                    @handleLink="handleLink"
                ></Menu>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    name: "Menu",
    props: {
        list: {
            type: Array,
            default: [],
        },
    },
    methods: {
        handleLink($event, item, index) {
            this.$emit("handleLink", $event, item, index);
        },
    },
};
</script>

<style lang="less" scoped>
.navMenu {
    height: auto;
    background: #fff;
    cursor: pointer;
    .item {
        width: 200px;
        color: black;
        .child,
        .item-cont {
            min-height: 50px;
            line-height: 50px;
            position: relative;
            &:hover {
                background: #94bce4;
            }
            &.is-disabled {
                opacity: 0.25;
                cursor: not-allowed;
            }
            .icon {
                content: "";
                border: 8px solid;
                border-color: #f00 transparent transparent transparent;
                position: absolute;
                top: calc(50% - 4px);
                right: 0;
            }
        }
        .list-child {
            margin-left: 30px;
            &.active {
                display: none;
            }
        }
    }
}
</style>

效果图

复制粘贴即可使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • VuePress 侧边栏的具体使用

    目录 前言 目录结构: 最简侧边栏: 侧边栏分组 显示文件名(或其他指定名字) 方法1 方法2 前言 官网写的侧边栏教程真的是让人很糟心,经过一番摸索,总算大致弄清楚了,下面详细说一下用法: 目录结构: docs根目录下有一个README.md.chinese文件夹.english文件夹 最简侧边栏: sidebar: { '/language/chinese/': [ '', //该目录下的README.md文件 'a', //该目录下的a.md文件 'b' //该目录下的a.md文件 ],

  • vue设置导航栏、侧边栏为公共页面的例子

    首先,项目结构如下: 想要让导航栏.侧边栏变为公共页面,则要在App.vue页面中加入.假设已经有了Header.vue和Left.vue,这里就不贴出来了,App.vue代码如下: <template> <div id="app"> <!-- 其他页 --> <el-container > <el-header> <!-- 导航栏 --> <header-nav></header-nav>

  • vue+elementUI组件递归实现可折叠动态渲染多级侧边栏导航

    早就实现了功能,但是发现点击的时候,选中的菜单项背景色会变白,周五时候仔细观察了一下,发现并不是调整样式的问题,而是选项没有被选中,于是好好研究了一下组件递归这块,总结记录一下心路历程 一.概念 递归:递归其实说白了,就是自己调用自己,样子就像是套娃一个套一个的,小时候玩过一个游戏汉诺塔就是利用的递归原理: 函数递归:函数利用函数名还调用自己 组件递归:所以组件递归利用的是vue组件中的name属性来实现的 二.需求 实现可折叠动态渲染多级侧边栏导航 三.分析 1.观察到侧边栏导航是一级一级的,

  • vue侧边栏动态生成下级菜单的方法

    循环传入的数据去生成下级菜单 <template> <div class="headBar"> <div class="title"> 微商城管理后台 </div> <el-menu class="el-menu-headBar" mode="horizontal" @select="handleSelect" background-color=&quo

  • vue实现侧边栏导航效果

    本文实例为大家分享了vue侧边栏导航的具体代码,供大家参考,具体内容如下 最终效果 点击下一个导航,上一个导航自动收回 实现代码 1.下载vue-router npm install vue-router --save-dev 2.在main.js中引入 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) // 引入路由 3.在components中新建组件 3.1 agencySearch.vue组件 代码

  • vue实现多级侧边栏的封装

    本文实例为大家分享了vue实现多级侧边栏的封装代码,供大家参考,具体内容如下 父组件 // 左侧导航菜单封装 <template>   <div class="nav">     <Menu @handleLink="handleLink" :list="list">     </Menu>     <div>{{value}}</div>   </div> &l

  • vue 面包屑导航组件封装

    目录 一.为什么需要面包屑? 二.初级封装 1. 实现思路 2. 代码演示 3. 使用 4. 不足 三.进阶封装 1. 实现思路 2. 代码演示 3. 使用 4. 不足 四.高阶封装 1. 思路 2. 代码演示 3. 使用 面包屑导航可以将浏览过的页面记录下来,方便很快速的跳转回某一个页面,本文介绍了几种自己封装面包屑组件的方式. 一.为什么需要面包屑? 当网页进行了多次跳转后,用户可能早就已经晕头转向了.作为程序猿的我们可能通过地址栏参数还可以分清楚当前处于哪一个位置,终归网页是要展示给用户.

  • vue 2.x 中axios 封装的get 和post方法

    vue 2.x axios 封装的get 和post方法 import axios from 'axios' import qs from 'qs' export class HttpService { Get(url, data) { return new Promise((resolve, reject) => { axios.get(url, { params: data }).then((res) => { if (res) { //成功回调 resolve(res); } }).ca

  • vue之浏览器存储方法封装实例

    如下所示: export function isObject (val) { return val !== null && typeof val === 'object' } export function setStore (key, val, type = 'localStorage') { if (isObject(val)) window[type].setItem(key, JSON.stringify(val)) else window[type].setItem(key, v

  • vue 基于element-ui 分页组件封装的实例代码

    具体代码如下所示: <template> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" layout="total, sizes, prev, pager, next, j

  • VUE 3D轮播图封装实现方法

    本文为大家分享了VUE 3D轮播图封装的具体代码,供大家参考,具体内容如下 一.体验地址 VUE 3D轮播图 二.实现功能点 (1).无缝轮播 (2).进入变大.离开缩小(类3d切换效果) 三.js代码 <!--轮播图插件模板--> <template> </template> <script type="text/ecmascript-6"> import {swiper, swiperSlide} from 'vue-awesome-

  • Vue 递归多级菜单的实例代码

    考虑以下菜单数据: [ { name: "About", path: "/about", children: [ { name: "About US", path: "/about/us" }, { name: "About Comp", path: "/about/company", children: [ { name: "About Comp A", path:

  • 详解Vue前端对axios的封装和使用

    Axios 是一个基于 promise 的 HTTP 库.将axios封装好后能更高效的开发并且方便维护,而且在以后的项目中也能直接套用,所以封装好是必要的.在参考了很多方法后,我拼凑出了一套我认为很实用的方法. 首先是http目录下的两个文件 helper.js 这个是功能性文件包括拼接url.过滤参数等,把方法集合到一个文件方便维护和修改. 读一遍知道他有什么功能就行了 const helper = { // 根据name获取地址栏的参数值 getQueryString (name) { l

  • 详解VUE Element-UI多级菜单动态渲染的组件

    以下是组件代码: <template> <div class="navMenu"> <label v-for="navMenu in navMenus"> <el-menu-item v-if="navMenu.childs==null&&navMenu.entity&&navMenu.entity.state==='ENABLE'" :key="navMenu.

随机推荐