本文实例为大家分享了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>
效果图
复制粘贴即可使用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did123947