递归竖栏菜单简单思路

这篇具有很好参考价值的文章主要介绍了递归竖栏菜单简单思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自己的项目要写一个竖栏菜单,所以记录一下思路吧,先粗糙的实现一把,有机会再把细节修饰一下

功能上就是无论这个菜单有多少层级,都能显示出来,另外,需要带图标,基于element-plus写成,当这个菜单栏点开的时候最好整个页面的高度不要有变化,最后整成了个小草稿

MyMenu.vue
<template>
    <!-- 自己写的竖栏菜单组件 -->
    <!-- <el-menu style="height: 100%;width:100%"> -->
    <el-scrollbar max-height=100%>
        <el-menu style="width: 100%;border: 0;" unique-opened :default-active="props.defaultIndex" active-text-color="#ffd04b"
            background-color="#545c64" text-color="#fff">
            <MenuTree :menu-data="props.data"></MenuTree>
        </el-menu>
    </el-scrollbar>
</template>
<script lang="ts" setup>
import MenuTree from "./MenuTree.vue"
const props=defineProps<{data:Array<any>,defaultIndex:string}>()
</script>

里面有个递归组件

MenuTree.vue
<template>
    <!-- 递归组件 -->
    <!-- 为了创建无限菜单而使用 -->
    <template v-for="value in props.menuData">
        <!-- 没有children就是一个单标签 -->
    <el-menu-item v-if="!value.children" :index="value.index">
        <template v-if="value.icon">
            <component :is="value.icon" style="width: 1rem;"></component>
        </template>
    {{ value.title }}
    </el-menu-item>
    <!-- 多标签的情况 -->
    <el-sub-menu v-else :index="value.index">
        <template #title>
            <template v-if="value.icon">
            <component :is="value.icon" style="width: 1rem;"></component>
        </template> 
            <span>{{ value.title }}</span></template>
        <MenuTree :menuData="value.children"></MenuTree>
    </el-sub-menu>

    </template>
</template>
<script setup lang="ts">
import MenuTree from "../Page1/MenuTree.vue"
const props=defineProps<{menuData:Array<any>}>()
</script>

最后写个参数挂载一下,我这边用的icon是element-plus组件自带的

<template>
    <el-container style="height: 100vh;">
        <el-header style="padding: 0;height: 5rem;">
            <div style="height: 100%;background-color:pink">
                <span>welcome to page1</span><br />
                <span>该页面用来写一个竖版menu</span>
            </div>
        </el-header>
        <el-container style="height: calc(100vh - 5rem);">
            <el-aside width="15%" style="background-color:lightblue;">
                <MyMenu :data="menuData" :default-index="defaultIndex"/>
            </el-aside>
            <el-main style="background-color:rgb(246, 199, 11);">
                <component :is="iconStr" style="width: 1rem;"></component>
            </el-main>
        </el-container>
    </el-container>
</template>
<script setup lang="ts">
import {ref} from "vue"
import { Search,Select,Close,User } from '@element-plus/icons-vue';
import MyMenu from './MyMenu.vue';
let menuData = [
    {
        title: "睡觉",
        index: "0",
        icon: Select
    },
    {
        title: "游戏",
        index: "1",
        icon: Search,
        children: [
            {
                title: "上古卷轴",
                index: "1-1",
                children: [
                    {
                        title: "上古卷轴匕首雨",
                        index: "1-1-1",
                    },
                    {
                        title: "上古卷轴天际",
                        index: "1-1-2",
                        icon: Select
                    }
                ]
            },
            {
                title: "辐射",
                index: "1-2",
                children: [
                    {
                        title: "龙万德",
                        index: "1-2-1"
                    },
                    {
                        title: "辐射新维加斯",
                        index: "1-2-2"
                    }
                ]
            }
        ]
    },
    {
        title: "美食",
        index: "2",
        icon: Close,
        children: [
            {
                title: "淮扬菜",
                index: "2-1",
                children: [
                    {
                        title: "红烧狮子头",
                        index: "2-1-1"
                    },
                    {
                        title: "猪头肉",
                        index: "2-1-2"
                    },
                ]
            },
            {
                title: "川菜",
                index: "2-2",
                children: [
                    {
                        title: "四川泡菜",
                        index: "2-2-1"
                    },
                    {
                        title: "水煮鱼",
                        index: "2-2-2"
                    },
                    {
                        title: "开水白菜",
                        index: "2-2-3"
                    },
                ]
            },
            {
                title: "粤菜",
                index: "2-3",
                children: [
                    {
                        title: "白切鸡",
                        index: "2-3-1"
                    },
                    {
                        title: "顺德鱼生",
                        index: "2-3-2"
                    },
                    {
                        title: "猪肚鸡",
                        index: "2-3-3"
                    },
                ]

            }
        ]
    },
    {
        title: "编程",
        index: "3",
        icon: User,
        children: [
            {
                title: "golang",
                index: "3-1",
                children: [
                    {
                        title: "云原生",
                        index: "3-1-1"
                    },
                    {
                        title: "gin",
                        index: "3-1-2"
                    }
                ]
            },
            {
                title: "js",
                index: "3-2"
            },
            {
                title: "python",
                index: "3-3"
            }
        ]
    }
]
// 默认index值
let defaultIndex = ref("0")
</script>

主要过程就是写了一个递归的菜单栏,然后用el-scrollbar包装了一下,以免这个菜单展开的时候把盒子高度撑开。

细节上难看了一点,此外我觉得整个菜单的高度应该和传入数组的最大深度相关,得把这个el-scrollbar组件换掉才行,先写着,有时间完善。文章来源地址https://www.toymoban.com/news/detail-622085.html

到了这里,关于递归竖栏菜单简单思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归遍历树结构数据(js,vue)

    数据实例: 主要代码:

    2024年02月13日
    浏览(49)
  • 前端vue自定义简单实用下拉筛选 下拉菜单

    前端vue自定义简单实用下拉筛选 下拉菜单, 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下:       #### 使用方法 ```使用方法 !-- titleArr: 选择项数组 dropArr: 下拉项数组 @finishDropClick: 下拉筛选完成事件-- ccDropDownMenu :titleArr=\\\"titleArr\\\" :dropArr=\\\"dropArr\\\" @finishDro

    2024年02月08日
    浏览(49)
  • 【Vue.js】使用Element中的Mock.js搭建首页导航&左侧菜单---【超高级教学】

          Mock.js是一个用于前端开发中生成随机数据、模拟接口响应的 JavaScript 库。模拟数据的生成器,用来帮助前端调试开发、进行前后端的原型分离以及用来提高自动化测试效率 总结来说,Element中的Mock.js是一个用于前端开发中生成随机数据、模拟接口响应的库。它可以帮助

    2024年02月07日
    浏览(43)
  • 【JavaScript】3.1 项目实践:制作一个简单的网页应用

    在此章节中,我们将学习如何使用JavaScript创建一个简单的网页应用。这将是一个待办事项列表应用,用户可以添加新的待办事项,标记已完成的事项,以及删除事项。通过这个项目,我们将学习如何使用JavaScript操作DOM,处理事件,以及使用localStorage进行数据存储。 我们的待

    2024年02月05日
    浏览(45)
  • 【Vue】Mock.js介绍和使用与首页导航栏左侧菜单搭建

    目录 一、Mock.js 1.1 mockjs介绍 1.2 mock.js安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js的使用 1.3.1 准备模拟数据 1.3.2 定义拦截路由 1.3.3 测试 二、首页导航栏左侧菜单搭建 2.1 自定义界面组件 (完整代码) 2.2 配置路由 2.3 组件显示折叠和展示图标 2.4 总线完成组件通信 2.

    2024年02月08日
    浏览(42)
  • 用js做一个简单的网页,用javascript做一个网页

    大家好,小编为大家解答用javascript写简单网页家乡的介绍代码的问题。很多人还不知道用javascript写简单网页小游戏,现在让我们一起来看看吧! 八、JavaScript基础 1.JavaScript JavaScript简称JS是用于制作网页的动态效果的,如:页面的弹出广告、浮动广告、下拉菜单、表单验证等

    2024年02月03日
    浏览(46)
  • React18-树形菜单-递归

    https://github.com/dL-hx/manager-fe/commit/85faf3b1ae9a925513583feb02b9a1c87fb462f7 从接口获取城市数据,渲染出一个树形菜单 要求: 可以展开和收起 学会递归渲染出一个树形菜单, 并点击后可以展开和收起 通过对数据上添加控制字段(show)避免在子组件添加各种同步的useState,等字段.保证单向数据

    2024年01月22日
    浏览(72)
  • 七、动态菜单—递归组件的使用

    多级路由时使用递归组件:必须给组件命名 因为每一个项我们要判断俩次(是否要隐藏,以及子组件个数),所以在el-menu-item外面又套了一层模板 当子路由个数大于等于一个时,并且或许子路由还有后代路由时。这里我们使用了递归组件。递归组件需要命名(另外使用一个

    2024年02月19日
    浏览(38)
  • 如何查询多级菜单(采用递归的方法)

    应用场景 1.京东 京东的页面就是这么显示的在家用电器下面有电视.空调.洗衣机然后再电视下面又有全面屏电视.教育电视等等 2.我们的后端管理系统 我们后端在页面上显示的很多也是通过层级目录的显示出来。 如何实现 我们这里parent_id为0的为我们的一级菜单 注意我们需要

    2024年02月14日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包