vue递归实现三级菜单

yizhihongxing
  1. 前置知识

在说如何实现三级菜单之前,我们需要先对一些基本概念进行了解,这些概念是实现三级菜单的基础,包括:

  • 父子组件通讯
  • 递归组件

  • 父子组件通讯

在vue中,组件之间的通讯主要有两种方式:props和$emit事件传递。props是父组件向子组件传递数据,而$emit事件传递则是子组件向父组件传递数据。

示例:父组件向子组件传递数据

在父组件中,我们通过在子组件标签上添加props,并传递需要传递的数据。

<template>
  <div>
    <MySubComponent :content="subContent"></MySubComponent>
  </div>
</template>

<script>
import MySubComponent from './MySubComponent.vue'
export default {
  components: { MySubComponent },
  data() {
    return {
      subContent: 'hello world'
    }
  }
}
</script>

而在子组件中,只需在props中声明需要接收的data,然后就可以通过{{}}的形式在模板中引用了。

<template>
  <div>
    {{ content }}
  </div>
</template>

<script>
export default {
  props: {
    content: {
      type: String,
      default: ''
    }
  }
}
</script>
  1. 递归组件

递归组件是指组件自我调用,实现循环嵌套的效果。在vue中,递归组件可以通过在组件内部嵌套组件并使用name属性实现。

示例:简单递归组件

这是一个简单的递归组件示例,实现了向下无限递归的效果。

<template>
  <div>
    <div>{{ level }}</div>
    <ul>
      <li v-for="item in list">
        <MyComponent :level="level + 1" :list="item.list"></MyComponent>
      </li>
    </ul>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue'
export default {
  name: 'MyComponent',
  components: { MyComponent },
  props: {
    level: {
      type: Number,
      default: 0
    },
    list: {
      type: Array,
      default: () => []
    }
  }
}
</script>
  1. 实现三级菜单

有了前置知识,我们就可以来实现三级菜单了。实现的过程中需要考虑以下几个方面:

  • 一级菜单点击展开二级菜单,再次点击关闭二级菜单
  • 二级菜单点击展开三级菜单,再次点击关闭三级菜单
  • 点击当前菜单以外区域,收起所有菜单

示例:三级菜单组件实现

我们通过创建一个三级菜单组件MyMenu.vue来实现三级菜单的效果。在这个组件中,我们主要需要实现以下几个功能:

  • 初始化一级菜单数据
  • 点击一级菜单,显示和隐藏二级菜单
  • 点击二级菜单,显示和隐藏三级菜单
  • 点击当前菜单以外区域,收起所有菜单

MyMenu.vue的具体实现如下所示:

<template>
  <div class="menu">
    <ul>
      <li v-for="(item, index) in menuData" :key="index">
        <div
          class="menu-item"
          @click="handleMenuClick(item)"
          :class="{ active: activeIndex === index }"
        >
          {{ item.title }}
        </div>
        <div class="sub-menu" v-show="activeIndex === index">
          <MyMenu :data="item.children" v-if="item.children"></MyMenu>
        </div>
      </li>
    </ul>
  </div>
</template>

<script>
import MyMenu from './MyMenu.vue'

export default {
  name: 'MyMenu',
  components: {
    MyMenu
  },
  props: {
    data: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      menuData: this.data,
      activeIndex: -1
    }
  },
  watch: {
    data() {
      this.menuData = this.data
      this.activeIndex = -1
    }
  },
  methods: {
    handleMenuClick(item) {
      this.activeIndex = this.activeIndex === item.index ? -1 : item.index
    },
    handleOutsideClick() {
      this.activeIndex = -1
    }
  },
  mounted() {
    document.addEventListener('click', this.handleOutsideClick)
  },
  beforeUnmount() {
    document.removeEventListener('click', this.handleOutsideClick)
  }
}
</script>
  1. 总结

这就是实现三级菜单的攻略,其中涉及到了vue中的父子组件通讯和递归组件。当然,上文只是一个简单的示例,要实现更为复杂的效果还需要进一步的学习和实践。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue递归实现三级菜单 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • java中定义常量方法介绍

    Java中定义常量方法介绍 在Java中,我们可以使用final关键字来定义常量。常量是指在程序运行期间不可改变的值。定义常量的方法有多种,下面将详细介绍。 1. 使用final关键字定义常量 在Java中,我们可以使用final关键字来定义常量。一旦将变量声明为final,它的值就不能再被修改。 final int MAX_VALUE = 100; 在上面…

    other 2023年7月29日
    00
  • shellswitch语句

    当然,我很乐意为您提供有关“shell switch语句”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是shell switch语句? shell switch语句是一种条件语句,用于根据不同的条件执行不同的代码块。它类似于if-else语句,但更适合处理多个条件。 2. shell switch语句的使用 以下是使用shell switch语句的步…

    other 2023年5月6日
    00
  • springboot+layui开发

    Spring Boot + Layui 开发攻略 Spring Boot是一个快速开发框架,Layui是一个轻量级的前端UI框架。本攻略将详细介绍如何使用 Boot 和 Layui 进行 Web 应用程序的开发。 环境搭建 在开始开发之前,我们需要安装 Java 和 Maven。可以使用命令在 Ubuntu 系统中安装 Java 和 Maven: sudo …

    other 2023年5月9日
    00
  • 一、Linux 设备驱动介绍及开发环境搭建

    一、Linux 设备驱动介绍及开发环境搭建 随着硬件设备的不断更新换代,嵌入式系统的开发也越来越需要设备驱动的支持。Linux 作为一种广泛使用的嵌入式系统,其对设备驱动的支持非常完善,因此学习 Linux 设备驱动的开发已经成为嵌入式开发者的必备技能之一。 1. 设备驱动介绍 设备驱动是连接操作系统和硬件设备之间的中间层,主要负责将操作系统的命令翻译成硬件…

    其他 2023年3月28日
    00
  • 关于python:tkinter理解mainloop

    关于Python: tkinter理解mainloop 在Python中,Tkinter是一个常用的GUI库,它提供了许多有用的功能和工具,可以帮助开发人员创建GUI应用程序。在Tkinter中,mainloop是一个非常重要的函数,它可以帮助应用程序保持运行状态并响应用户事件。以下是关于Python: tkinter理解mainloop的完整攻略,包括常见…

    other 2023年5月9日
    00
  • 浅谈Python 参数与变量

    浅谈Python 参数与变量 在Python中,参数和变量是编程中非常重要的概念。参数是函数定义时用于接收外部传入值的变量,而变量则是用于存储数据的容器。本文将详细讲解Python中参数和变量的使用方法。 参数 位置参数 位置参数是指在函数定义时按照顺序声明的参数,调用函数时需要按照相同的顺序传入对应的值。下面是一个示例: def add(x, y): re…

    other 2023年8月15日
    00
  • Android嵌套滚动与协调滚动的实现方式汇总

    Android嵌套滚动与协调滚动的实现方式汇总 在Android开发中,嵌套滚动和协调滚动是常见的需求。嵌套滚动指的是在一个滚动容器中,包含了另一个滚动容器,而协调滚动则是指两个或多个滚动容器之间的滚动行为相互关联。本文将详细介绍Android中实现嵌套滚动和协调滚动的几种方式,并提供两个示例说明。 1. 使用NestedScrollView和Recycle…

    other 2023年7月28日
    00
  • 解决SpringBoot加载application.properties配置文件的坑

    当我们使用SpringBoot创建项目时,我们通常希望使用application.properties或者application.yml配置文件来配置一些应用程序的参数,这也是SpringBoot在开发中非常常见的一种方式。但是在实际使用中,我们可能会遇到加载配置文件失败的情况,下面是解决SpringBoot加载application.properties配…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部