Vue递归实现树形菜单方法实例

yizhihongxing

Vue递归实现树形菜单方法实例

在 Vue 中实现树形菜单,我们可以通过递归组件的方式来实现。本文将详细介绍如何使用递归组件实现树形菜单,并给出两个示例供大家参考。

步骤

  1. 定义数据结构

我们首先需要定义一个树形结构的数据。这里我们以一个简单的 JSON 数据为例:

{
  "id": 1,
  "name": "根节点",
  "children": [
    {
      "id": 2,
      "name": "子节点1",
      "children": [
        {
          "id": 4,
          "name": "子节点1-1",
          "children": []
        },
        {
          "id": 5,
          "name": "子节点1-2",
          "children": []
        }
      ]
    },
    {
      "id": 3,
      "name": "子节点2",
      "children": []
    }
  ]
}
  1. 定义递归组件

定义一个递归组件,用来展示上面定义的树形数据。

<template>
  <ul>
    <li v-for="node in tree">
      {{ node.name }}
      <tree-node :child-nodes="node.children" />
    </li>
  </ul>
</template>

<script>
export default {
  name: "tree-node",
  props: {
    childNodes: {
      type: Array,
      default: () => [],
    },
  },
  components: {
    TreeNode: {
      name: "tree-node",
      props: {
        childNodes: {
          type: Array,
          default: () => [],
        },
      },
      template: `
        <li v-for="node in childNodes">
          {{ node.name }}
          <tree-node :child-nodes="node.children" />
        </li>
      `,
    },
  },
};
</script>

这里使用了递归组件,即组件自身会嵌套调用自己。<tree-node :child-nodes="node.children" />就是在递归调用自己。

  1. 使用递归组件

在 Vue 中使用递归组件非常简单,只需要在组件内部调用它自己就可以了。

<template>
  <tree-node :child-nodes="data" />
</template>

<script>
import TreeNode from "./TreeNode.vue";

export default {
  name: "app",
  components: {
    TreeNode,
  },
  data() {
    return {
      data: {
        "id": 1,
        "name": "根节点",
        "children": [
          {
            "id": 2,
            "name": "子节点1",
            "children": [
              {
                "id": 4,
                "name": "子节点1-1",
                "children": []
              },
              {
                "id": 5,
                "name": "子节点1-2",
                "children": []
              }
            ]
          },
          {
            "id": 3,
            "name": "子节点2",
            "children": []
          }
        ]
      },
    };
  },
};
</script>

示例

示例1

先放上一个示例代码。

// App.vue
<template>
  <div>
    <tree-node :tree="data" />
  </div>
</template>

<script>
import TreeNode from "./TreeNode.vue";

export default {
  name: "app",
  components: {
    TreeNode,
  },
  data() {
    return {
      data: {
        "id": 1,
        "name": "根节点",
        "children": [
          {
            "id": 2,
            "name": "子节点1",
            "children": [
              {
                "id": 4,
                "name": "子节点1-1",
                "children": []
              },
              {
                "id": 5,
                "name": "子节点1-2",
                "children": []
              }
            ]
          },
          {
            "id": 3,
            "name": "子节点2",
            "children": []
          }
        ]
      },
    };
  },
};
</script>

// TreeNode.vue
<template>
  <ul>
    <li v-for="node in tree">
      {{ node.name }}
      <tree-node :tree="node.children" />
    </li>
  </ul>
</template>

<script>
export default {
  name: "tree-node",
  props: {
    tree: {
      type: Object,
      default: () => {},
    },
  },
  components: {
    TreeNode: {
      name: "tree-node",
      props: {
        tree: {
          type: Object,
          default: () => {},
        },
      },
      template: `
        <li v-for="node in tree">
          {{ node.name }}
          <tree-node :tree="node.children" />
        </li>
      `,
    },
  },
};
</script>

示例2

这个示例使用了 Vuex 来存储树形数据并展示。

// App.vue
<template>
  <div>
    <tree-node :tree="tree" />
  </div>
</template>

<script>
import TreeNode from "./TreeNode.vue";
import { mapState } from "vuex";

export default {
  name: "app",
  components: {
    TreeNode,
  },
  computed: {
    ...mapState(["tree"]),
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      const data = {
        "id": 1,
        "name": "根节点",
        "children": [
          {
            "id": 2,
            "name": "子节点1",
            "children": [
              {
                "id": 4,
                "name": "子节点1-1",
                "children": []
              },
              {
                "id": 5,
                "name": "子节点1-2",
                "children": []
              }
            ]
          },
          {
            "id": 3,
            "name": "子节点2",
            "children": []
          }
        ]
      };

      this.$store.commit("SET_TREE", data);
    },
  },
};
</script>

// TreeNode.vue
<template>
  <ul>
    <li v-for="node in tree">
      {{ node.name }}
      <tree-node :tree="node.children" />
    </li>
  </ul>
</template>

<script>
export default {
  name: "tree-node",
  props: {
    tree: {
      type: Array,
      default: () => [],
    },
  },
  components: {
    TreeNode: {
      name: "tree-node",
      props: {
        tree: {
          type: Array,
          default: () => [],
        },
      },
      template: `
        <li v-for="node in tree">
          {{ node.name }}
          <tree-node :tree="node.children" />
        </li>
      `,
    },
  },
};
</script>

在这个示例中,我们使用了 Vuex 保存了树形结构的数据,并在组件中使用 mapState 获取了 tree 数据,并将 tree 传递给了递归组件 TreeNode。在 init 方法中我们初始化了树形数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue递归实现树形菜单方法实例 - Python技术站

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

相关文章

  • iOS8.2正式版固件下载 苹果官方iOS8.2正式版固件下载地址大全

    iOS 8.2正式版固件下载攻略 苹果官方发布了iOS 8.2正式版固件,本攻略将为您提供详细的下载步骤和下载地址大全。 步骤一:备份数据 在开始下载之前,建议您先备份您的设备上的所有数据。这样可以确保您的数据在升级过程中不会丢失。您可以通过iTunes或iCloud进行备份。 步骤二:检查设备兼容性 在下载iOS 8.2之前,请确保您的设备兼容该版本。iO…

    other 2023年8月4日
    00
  • 解决firefox不支持-webkit-line-clamp属性

    解决Firefox不支持-webkit-line-clamp属性 在网页设计中,为了美观和易读性,经常需要对文本进行截取或折叠显示。这时我们可以使用 text-overflow 和 line-clamp 属性来实现。比如,使用 line-clamp 属性可以限制文本行数并折叠多余部分。 但是,line-clamp 属性只在 WebKit 内核的浏览器中才被支…

    其他 2023年3月28日
    00
  • Javascript基础教程之变量

    JavaScript基础教程之变量 什么是变量? 在JavaScript中,变量是用于存储数据的容器。它们可以存储各种类型的数据,例如数字、字符串、布尔值等。变量还可以在程序中被修改和访问。 声明变量 在JavaScript中,我们使用var、let或const关键字来声明变量。这些关键字有不同的作用范围和行为。 使用var声明变量 var是在ES5中引入的…

    other 2023年8月9日
    00
  • socket.io学习教程之深入学习篇(三)

    《socket.io学习教程之深入学习篇(三)》是一篇关于socket.io的深入学习的教程。该教程主要分为以下几个部分: 一、前言 该部分主要介绍了本教程主要内容以及socket.io的基本概念,这里不再赘述。 二、Socket.io 原理详解 该部分详细介绍了socket.io的原理以及其实现机制,包括了: Socket.io 的核心代码结构 Socke…

    other 2023年6月27日
    00
  • rfa文件用什么软件打开?什么是文件扩展名为RFA?

    RFA文件用什么软件打开?什么是文件扩展名为RFA? RFA是Revit Family文件的扩展名,Revit是一种建筑信息建模(BIM)软件,用于设计、建模和分析建筑项目。RFA文件包含了Revit软件中的家族(Family)定义,家族是一组具有相似属性和参数的建筑元素,如墙、窗户、门等。RFA文件通常用于共享和重用建筑元素。 要打开RFA文件,您需要使用…

    other 2023年8月6日
    00
  • vs怎么拖动控件到窗口? Visual Studio进行拖控件编程的技巧

    在Visual Studio中进行拖控件编程,可分为以下几个步骤: 1. 打开窗口设计器 在Visual Studio中,我们可以使用窗口设计器来进行拖控件编程。首先需要打开窗口设计器,在Solution Explorer中找到目标窗口的.cs文件,双击打开,或者在设计器中找到目标窗口并双击打开。 2. 打开工具箱 在Visual Studio的左侧有一个工…

    other 2023年6月27日
    00
  • 关于android:您正在使用x509trustmanager的不安全实现

    已经回答了您的问题,请查看上面的回答。如果您有任何其他问题或需要进一步的帮助,请告诉我。

    other 2023年5月7日
    00
  • 自制小工具大大加速mysqlsql语句优化(附源码)

    自制小工具大大加速MySQL语句优化(附源码) MySQL是一个非常流行的关系型数据库,但是随着数据量的增加,优化MySQL查询语句也变得越来越重要。本文将介绍一款自制小工具,可以帮助您更快速地进行MySQL语句优化。 背景介绍 在工作中,我们常常需要对全表进行数据查询操作,当数据量较大时,查询速度会变得非常慢。而优化MySQL语句可以大大提高查询速度,但是…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部