Ehan Van的博客
首页
前端笔记
首页
前端笔记
  • 前端笔记

    • v-on的使用
    • 编写一个Vue递归组件
    • 非vue文件中申明的ref如何使用
    • Vue3如何在hook中执行异步函数并同步返回响应式数据
    • 如何终止forEach循环
    • 递归创建下拉树数据
    • 编写一个Vue Web Components
    • js数组toString的使用
    • vueconfig配置多page遇到的坑
    • js事件循环机制
    • React列表渲染中图片闪烁问题
    • 开发中未配置Referrer遇到的坑
    • 前端实现文件分片上传
    • 防抖函数
    • 编写一个vue插件
    • 发布订阅模式

业务场景

在前端业务开发中,难免会遇到生成菜单栏的需求,如果菜单层级只有2层,那还好说。如果菜单层级超过3层,则应该考虑优化为递归组件。以下是代码实现:

官方文档参考

代码实现

<!-- 父组件中 -->
<el-menu
	class="h-full"
	background-color="#fff"
	:default-active="formData.materialCategory"
  @select="selectCategory"
 >
    <DropdownItem v-for="item in menuTree" :key="item.id" :item="item" />
</el-menu>
<!-- DropdownItem.vue 子组件 -->
<template>
  <el-sub-menu v-if="item?.children?.length" :index="item.id + ''">
    <template #title>
      <span>{{ item.label }}</span>
    </template>
	<!-- DropdownItem应该和vue文件名保持一致,具体参阅官方文档 -->
    <DropdownItem v-for="child in item.children" :key="child.id" :item="child" />
  </el-sub-menu>
  <el-menu-item v-else :index="item.id + ''">
    {{ item.label }}
  </el-menu-item>
</template>
<script setup>
defineProps({
  item: {
    type: Object,
    default: () => ({})
  }
});
</script>

Prev
v-on的使用
Next
非vue文件中申明的ref如何使用