Vue 3 和 <script setup> 的组件,它使用 v-for 来渲染一个嵌套的菜单结构。

ops/2025/2/12 23:34:23/

 Vue 3 和 <script setup> 的组件,它使用 v-for 来渲染一个嵌套的菜单结构。

[{"id": 1,"title": "Navigator One","children": [{"id": 11, "title": "Item One"},{"id": 12, "title": "Item Two"},{"id": 13, "title": "Item Three"},{"id": 14,"title": "Item Four","children": [{"id": 141, "title": "Sub Item One"}]}]},{"id": 2,"title": "Navigator Two","children": []}
]

Vue 3 组件

<template><el-menu><RecursiveMenu :items="menuData" /></el-menu>
</template><script setup>
import { ref } from 'vue';
import RecursiveMenu from './RecursiveMenu.vue';// 示例数据(通常你会从 API 获取这些数据)
const menuData = ref([// ...(填入上面的 JSON 数据)
]);
</script><!-- RecursiveMenu.vue -->
<template><div v-for="item in items" :key="item.id"><el-sub-menu v-if="item.children && item.children.length" :index="item.id.toString()"><template #title><span>{{ item.title }}</span></template><RecursiveMenu :items="item.children" /></el-sub-menu><el-menu-item v-else :index="item.id.toString()"><span>{{ item.title }}</span></el-menu-item></div>
</template><script setup>
import { defineProps } from 'vue';interface MenuItem {id: number | string; title: string;children?: MenuItem[];
}interface RecursiveMenuProps {items: MenuItem[];
}const props = defineProps<RecursiveMenuProps>();</script>

在这个例子中,RecursiveMenu.vue 是一个递归组件,它负责渲染菜单项和它们的子项。主组件使用 <script setup> 语法,并引入了 RecursiveMenu 组件来渲染整个菜单。菜单数据被存储在一个 ref 中,但通常会从后端 API 获取这些数据。

代码的详细解释:

这段代码是一个 Vue 组件的模板部分,它使用了 Vue 的模板语法来动态渲染一个菜单结构。这个菜单可以是多级的,其中每一级菜单项由 el-sub-menu 和 el-menu-item 组件表示。这里还使用了递归组件 RecursiveMenu 来处理子菜单项。

  1. v-for 指令
    • v-for="item in items":这个指令遍历 items 数组,为每个元素创建一个模板实例。每个元素都被赋值给变量 item
    • :key="item.id":这里使用 :key 绑定为每个循环的元素提供一个唯一的键值。这是 Vue 推荐的做法,可以提高 DOM 更新的效率。item.id 是每个菜单项的唯一标识符。
  2. 条件渲染
    • v-if="item.children && item.children.length":这个指令检查当前菜单项 item 是否有子菜单项(即 item.children 是否存在且长度大于 0)。如果条件为真,则渲染 el-sub-menu 组件;否则,渲染 el-menu-item 组件。
  3. el-sub-menu 组件
    • 用于表示有子菜单的菜单项。
    • :index="item.id.toString()":设置子菜单的索引,这里将 item.id 转换为字符串形式。索引通常用于标识菜单项,以便在需要时可以通过编程方式访问或操作它们。
    • <template #title>:这是一个具名插槽,用于定义子菜单的标题。在这个插槽内,你可以自定义子菜单标题的显示方式。
      • <span style="font-size: 1.0625rem;">{{ item.title }}</span>:这里使用了一个 <span> 元素来显示菜单项的标题,并通过内联样式设置了字体大小。
    • <RecursiveMenu :items="item.children" />:这是一个递归组件的调用,它将当前菜单项的子菜单项作为 items prop 传递给 RecursiveMenu 组件。这样,如果子菜单项本身还有子菜单项,它们也会被递归地渲染出来。
  4. el-menu-item 组件
    • 用于表示没有子菜单的菜单项。
    • 和 el-sub-menu 类似,它也使用 :index="item.id.toString()" 来设置索引。
    • 菜单项的标题也是通过 <span> 元素显示的,样式和 el-sub-menu 中的标题相同。
  5. 递归组件
    • RecursiveMenu 是一个递归组件,它接受一个 items prop,这个 prop 是一个菜单项数组。组件内部使用与上述相同的模板逻辑来渲染这些菜单项。
    • 递归组件的关键在于它能够调用自身来处理嵌套结构,如多级菜单。

总的来说,这段代码定义了一个能够递归渲染多级菜单结构的 Vue 组件模板。每个菜单项可以是一个包含子菜单项的父菜单项,也可以是一个不包含子菜单项的普通菜单项。通过使用递归组件和条件渲染,这个模板能够灵活地处理任意深度的菜单结构。


http://www.ppmy.cn/ops/157892.html

相关文章

将jar制作成docker镜像运行

将jar制作成docker镜像运行 手动编写 Dockerfile 方式 1. 准备工作 确保你已经安装了 Docker&#xff0c;并且 Docker 服务正在运行。 有一个可运行的 JAR 文件&#xff0c;假设文件名为 your-application.jar。 修改springboot配置文件让日志输出到指定目录下文件中 appli…

网络安全知识--网络、网络安全产品及密码产品概述

网络、网络安全产品及密码产品概述 网络、安全产品网络安全关注重点 网络结构 网络设备&#xff1a;交换机、路由器、负载均衡 安全设备&#xff1a; 通信网络安全类:通信安全、网络监测与控制 区域边界安全类&#xff1a;隔离类、入侵防范、边界访问 安全服务&#xff…

ML.NET库学习003:基于时间序列的共享单车需求预测项目解析

文章目录 ML.NET库学习003&#xff1a;基于时间序列的共享单车需求预测项目解析项目主要目的和原理目的原理 项目概述数据来源工具与框架 Program.cs主要功能和步骤1. 数据加载与预处理2. 特征工程3. 模型训练4. 模型评估5. 模型生成 ModelScoringTester.cs分析与解读方法一&am…

JVM速成=。=

JVM跨平台原理 跨平台&#xff1a;一次编译&#xff0c;到处运行 本质&#xff1a;不同操作系统上运行的JVM不一样&#xff0c;只需要把java程序编译成一份字节码文件&#xff0c;JVM执行不同的字节码文件。 Java是高级语言&#xff0c;提前编译一下&#xff08;变成字节码文件…

错误报告:非正常关机引发OTA升级失败:缓存丢失问题的排查与解决

项目背景 该项目涉及在设备端运行的 IoT 客户端&#xff0c;该客户端与服务器之间通过 WebSocket (WS) 保持实时连接&#xff0c;进行指令下发和响应。设备在开机时自动启动客户端&#xff0c;并连接至服务器&#xff0c;等待接收指令。以下是项目的具体行为流程&#xff1a; …

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示&#xff1a; 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表&#xff0c;它只能在固定的一端&#xff08;栈顶&#xff09;进行出栈、压栈操作&#xff0c;具有后进先出的特点。 2、栈概念的例题 答案为 C&#xff0c;以C为例进行讲解&#xff1a; 第一个出栈的是3&#xff0c;那么 1、…

【数据结构】寻找规律:算对角线长度||杨辉三角||魔方问题(C语言实现)

目录标题 三个算法1. 求矩阵对角线元素之和&#xff08;C语言&#xff09;2. 杨辉三角3. 幻方问题 总结&#xff1a;都是通过寻找规律来找出构造逻辑然后用循环来实现 三个算法 1. 求矩阵对角线元素之和&#xff08;C语言&#xff09; 1.初始化行循环变量i和列循环遍历j&…