Vue3实战笔记(34)—完美的菜单组件封装

文章目录

  • 前言
  • 多层菜单封装
  • 总结


前言

之前简单的封装了一下菜单组件,数据都是写死的,多层嵌套没有支持,学完了组件传值,计算属性就可以继续完善了。


多层菜单封装

先看下数据结构:

 {
        "id":"1",
        "name":"系统管理",
        "path":"/system",
        "hidden":false,
        "icon":"mdi:mdi-minus",
        "component":"",
        "redirect":"noDirect",
        "children": [
          {        
            "id":"11",
            "name":"用户管理",
            "path":"/user",
            "hidden":false,
            "icon":"mdi:mdi-account",
            "component":"",
            "redirect":"noDirect",
            "children":[
              {        
              "id":"111",
              "name":"小白兔",
              "path":"/user",
              "hidden":false,
              "icon":"mdi-account",
              "component":"",
              "redirect":"noDirect",
              "children":[] 
              }
            ] 
          }
        ]
      }

数据有多层,所以使用嵌套,定义一个item组件NavigationItem.vue:

<template>

      <div v-if=hasChildren>
        <v-list-group :value="navigationItem.name">
          <template v-slot:activator="{ props }">
            <v-list-item
              v-bind="props"
              :title="navigationItem.name"
              prepend-icon="mdi:mdi-minus"
            ></v-list-item>
          </template>

          

          <NavigationItem v-for="child in navigationItem.children"
          :key = child.id
          :navigationItem = child
          >
          </NavigationItem>
        </v-list-group>
      </div>
      <div v-else >
          <v-list-item :prepend-icon="navigationItem.icon" :title="navigationItem.name" :value="navigationItem.name"></v-list-item> 
        </div>
       
</template>
    <script  lang='ts' setup name="Navigation">
    import { computed, onMounted, ref } from 'vue';
    import {NavigationItemInterface} from '@/types'
    

    const {navigationItem} = defineProps<{navigationItem:NavigationItemInterface}>()

    //组合式计算属性写法
    let hasChildren = computed(()=>{
      return navigationItem.children.length>0
    })

    
</script>

重点思路:如果有子节点就展示v-list-group,然后调用自己,如果没有子节点就展示v-list-item。

父组件还用之前的Navigation.vue,修改成调用子组件并传值:


<template>

        <v-navigation-drawer
          v-model="drawer"
          :rail="rail"
          permanent
          @click="rail = false"
        >
          <v-list-item
            prepend-avatar="https://randomuser.me/api/portraits/men/88.jpg"
            title="John Leider"
            nav
          >
            <template v-slot:append>
              <v-btn
                variant="text"
                icon="mdi:mdi-chevron-left"
                @click.stop="rail = !rail"
              ></v-btn>
            </template>
          </v-list-item>
          <v-divider></v-divider>
          
          <!-- 菜单---start -->
          <v-list density="compact" nav>

              <NavigationItem  
                v-for="navigationItem in navigationItems"
                :navigationItem = "navigationItem"
                :key = navigationItem.id
              ></NavigationItem>
          </v-list>
          <!-- 菜单---end -->
        </v-navigation-drawer>
        

  </template>
  <script  lang='ts' setup name="Navigation">
    import { ref } from 'vue';


    let drawer=ref(true)
    let rail=ref(false)//false代表展开
    let navigationItems = ref([
      {
        "id":"1",
        "name":"系统管理",
        "path":"/system",
        "hidden":false,
        "icon":"mdi:mdi-minus",
        "component":"",
        "redirect":"noDirect",
        "children": [
          {        
            "id":"11",
            "name":"用户管理",
            "path":"/user",
            "hidden":false,
            "icon":"mdi:mdi-account",
            "component":"",
            "redirect":"noDirect",
            "children":[
              {        
              "id":"111",
              "name":"小白兔",
              "path":"/user",
              "hidden":false,
              "icon":"mdi-account",
              "component":"",
              "redirect":"noDirect",
              "children":[] 
              }
            ] 
          }
        ]
      },
      {
        "id":"2",
        "name":"开发工具",
        "path":"/system",
        "hidden":false,
        "icon":"mdi:mdi-tools",
        "component":"",
        "redirect":"noDirect",
        "children":[] 
      },
      {
        "id":"3",
        "name":"UI元素",
        "path":"/contact",
        "hidden":false,
        "icon":"mdi:mdi-ubisoft",
        "component":"",
        "redirect":"noDirect",
        "children":[] 
      },
      {
        "id":"4",
        "name":"联系我们",
        "path":"/contact",
        "hidden":false,
        "icon":"mdi:mdi-contacts",
        "component":"",
        "redirect":"noDirect",
        "children":[] 
      },

    ])
</script>

子组件接口定义:


export interface NavigationItemInterface{
    children: Array<NavigationItemInterface>,
      id:string,
      name:string,
      hidden:boolean,
      icon:string,
      component:string,
      redirect:string,
      path:string

  }

效果展示:
在这里插入图片描述

总结

在前文的基础上对左侧导航栏组件完善了一下。

心向阳光,阴影自退。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手推车式电缆故障定位系统

武汉凯迪正大一体化电缆故障高压发生器用于测试各种型号的380V,600V,10kV,35kV,110kV,220kV,380kV电压等级的铜铝芯电力电缆、同轴通信电缆和市话电缆的各类故障&#xff0c;如电缆全长、开路、短路、断线、低阻故障、高阻故障、高阻泄露、高低阻抗接地、接地故障、铠装接地故障…

研发设计管理、研发设计管理系统有哪些

研发设计管理系统种类繁多&#xff0c;每种系统都有其特定的功能和用途。以下是一些常见的研发设计管理系统及其主要功能&#xff1a; PLM&#xff08;产品生命周期管理&#xff09;研发管理系统&#xff1a; 功能&#xff1a;管理产品从概念、设计、开发、制造、销售到维护的…

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述 关于此文&#xff0c;我的一个见解想法&#xff0c;重点关注他怎么描述 「Diffusion Model」的引用的&#xff0c;以及未来方向就好了。当然从这篇文章可以知道 「Diffusion Model」的一个基石…

芝加哥大学最新研究:GPT-4与财务预测,重塑财务分析的未来

最近&#xff0c;芝加哥大学的研究团队发表了一篇突破性的研究&#xff0c;展示了大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是 OpenAI 开发的 GPT-4&#xff0c;如何在财务报表分析领域取得了与专业分析师相匹配甚至超越的表现。这项研究不仅凸显了人工智能在高…

Firefox国际版

Firefox国际版官方网址&#xff1a; Download the Firefox Browser in English (US) and more than 90 other languagesEveryone deserves access to the internet — your language should never be a barrier. That’s why — with the help of dedicated volunteers around…

Docker-----emqx部署

emqx通过Docker容器化部署流程 1.创建持久化挂载目录 mkdir -p /home/emqx/etc ------挂载emqx的配置文件目录 mkdir -p /home/emqx/data ------挂载emqx的存储目录 mkdir -p /home/emqx/log ------挂载emqx的日志目录 [root home]# mkdir -p /home/emqx/etc [root home]# mkd…

C++ vector 模拟实现

vector的底层也是一个动态数组&#xff0c;他与 string 的区别就是&#xff0c;string 是专门用来存储字符类数据的&#xff0c;为了兼容C语言&#xff0c;使用C语言的接口&#xff0c;在string的动态数组内都会都开一块空间用来存 \0 &#xff0c;而vector则不会。 首先我们要…

文本生成流程图 泰酷啦 Excalidraw Mermaid Obsidian

前言 介绍一个很酷的工具&#xff0c;Mermaid to Excalidraw 。作用是用代码生成流程图。 Mermaid 是一款强大的、轻量级的文本到图表的转换工具&#xff0c;它允许用户使用简单的Markdown风格的语法编写文本描述&#xff0c;然后通过JavaScript引擎将其转换成美观的图表。Mer…

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在图像识别中&#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系&#xff0c;但这种形式效率极低。因此&…

在VSCode 中增加文件与文件夹的可辨识度

今天重新打开VSCode&#xff0c;打算新建一个项目做测试&#xff0c;看到VSCode中的文件与文件夹很不容易辨认&#xff0c;有时候容易导致一些误操作&#xff0c;需要做一些配置来改变。 效果图&#xff1a; 只需要做简单的2步就可以了。 1、安装插件 ⑴ 打开VSCode的扩展搜索并…

服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程

服务器的远程桌面无法连接&#xff0c;服务器远程桌面无法连接问题处理教程。 一、问题概述 服务器远程桌面无法连接是日常运维中常见的问题之一。它可能由多种原因造成&#xff0c;如网络问题、服务器配置错误、远程桌面服务未启动等。本教程将指导您逐步排查并解决这些问题。…

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明&#xff1a;参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎&#xff0c;这不yolov10又来了&#xff0c;那么…

定点化和模型量化(三)

量化解决的是训练使用的浮点和运行使用的硬件只支持定点的矛盾。这里介绍一些实际量化中使用到的工具。 SNPE简介 The Snapdragon Neural Processing Engine (SNPE)是高通骁龙为了加速网络模型设计的框架。但它不只支持高通&#xff0c;SNPE还支持多种硬件平台&#xff0c;AR…

软件即服务-SaaS

目录 1. SaaS成熟度模型 2. SaaS应用平台 3. SaaS应用实现层次 4. 多租户技术 5. 可配置性 5.1 业务构件 5.2 数据可配置 5.2.1 定制字段 5.2.2 预分配字段 5.2.3 名称值对 5.3 功能可配置 5.3.1 业务构件设计 5.3.2 功能包设计 5.3.3 销售包设计…

Postman快捷功能-批量断言与快速查询替换

大家好&#xff0c;在我们日常的接口测试工作中&#xff0c;经常需要对接口返回的数据进行断言&#xff0c;以确保接口的正确性。当接口数量较多时&#xff0c;逐个编写断言语句会变得非常繁琐。此外&#xff0c;在接口测试过程中&#xff0c;我们还可能需要频繁地查找和替换某…

遇到软件测试职业瓶颈,如何突破

作为职场人&#xff0c;遇到发展瓶颈是在所难免的&#xff0c;无论是晋升受限、技能升级缓慢&#xff0c;还是工作激情的丢失&#xff0c;这些挑战都可能让人感到挫败。但是&#xff0c;积极应对&#xff0c;你就可能找到那扇通向新机遇的窗。 1. 自我评估 识别问题 是缺乏技能…

内存卡频频提示格式化?数据恢复全攻略

内存卡提示需要格式化 在数字时代&#xff0c;内存卡作为我们存储数据的常用设备&#xff0c;广泛应用于手机、相机、无人机等多种设备中。然而&#xff0c;不少用户在使用过程中会突然遭遇一个令人头疼的问题——内存卡提示需要格式化。这一提示往往伴随着数据的丢失风险&…

MobaXterm下载虚拟机SSH链接超时解决(保姆级踩坑)

文章目录 为啥要用MobaXtermMobaXterm下载打开虚拟机ssh链接ssh连接失败排查linux配置windows配置 到这了&#xff0c;什么都干了&#xff0c;怎么还不成功&#xff1f; 更多相关内容可查看 在一个阳光明媚的下午&#xff0c;开启了无限踩坑的旅程 为啥要用MobaXterm 作为小编…

【LeetCode】37.解数独

解数独 题目描述&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参…

gif帧数修改怎么操作?一键掌握GIF帧数修改技巧!

gif帧数修改怎么操作&#xff1f;在数字化信息爆炸的时代&#xff0c;GIF动图因其生动有趣的特性而备受广大网友喜爱。然而&#xff0c;很多时候我们可能会遇到GIF动图帧数过多或过少&#xff0c;导致动画效果不尽如人意的情况。那么&#xff0c;如何对GIF动图的帧数进行修改呢…