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

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日

相关文章

  • shell通过正则匹配ip地址实例代码

    当使用Shell脚本编写时,可以使用正则表达式来匹配IP地址。下面是一个完整的攻略,包含了两个示例说明。 步骤1:编写正则表达式 首先,我们需要编写一个正则表达式来匹配IP地址。IP地址由四个数字组成,每个数字的范围是0到255。以下是一个匹配IP地址的正则表达式示例: ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ 步骤2:编写Shell脚本…

    other 2023年7月30日
    00
  • Android实现带进度条的WebView

    Android实现带进度条的WebView攻略 在Android应用中实现带进度条的WebView可以提供更好的用户体验。下面是一个完整的攻略,包含了两个示例说明。 步骤1:布局文件 首先,在布局文件中定义一个ProgressBar和一个WebView,如下所示: <RelativeLayout xmlns:android=\"http://…

    other 2023年9月7日
    00
  • 如何使用processon制作思维导图

    如何使用ProcessOn制作思维导图 思维导图是一种常用的知识整理工具,可以方便地将复杂的思路整理成清晰可见的图形。而ProcessOn是一款免费、易用的思维导图工具,以下是使用ProcessOn制作思维导图的详细步骤。 步骤一:注册帐号 访问ProcessOn官网(https://www.processon.com/)后,点击右上角的“注册”按钮,填写邮…

    其他 2023年3月28日
    00
  • windows下指定IP地址远程访问服务器的设置方法

    以下是详细讲解“Windows下指定IP地址远程访问服务器的设置方法”的完整攻略。 解决方法 要实现在Windows下指定IP地址远程访问服务器,需要进行以下步骤: 查找服务器IP地址 在开始设置之前,需要找到服务器的IP地址。可以在服务器本身上使用ipconfig等命令来查找其IP地址,或者向运维人员或管理员询问。 假设服务器的IP地址为192.168.1…

    other 2023年6月27日
    00
  • powerdesigner使用详解

    以下是PowerDesigner使用详解的完整攻略,过程中包含两个示例说明的标准Markdown格式文本: PowerDesigner使用详解 PowerDesigner是一款流程建模和数据建模工具,可以帮助用户设计管理复杂的数据模型和流程。以下是使用PowerDesigner的详细步骤: 下载和安装PowerDesigner。可以从官方网下载PowerDe…

    other 2023年5月10日
    00
  • js延迟加载的6种方式实例总结

    首先我们需要了解什么是js延迟加载。js延迟加载是指在网页中,等到网页加载完成后再加载js文件,以此提高网页加载速度和用户体验。 接下来,我们详细讲解一下js延迟加载的6种方式: defer属性 defer属性是script标签的一个属性,它告诉浏览器下载js文件的时候不会阻塞页面渲染过程,而是会等到页面渲染完成后再执行js文件。示例如下: <scri…

    other 2023年6月25日
    00
  • dpkg卸载deb包方法精讲

    Sure! 下面为你提供详细的 dpkg卸载deb包方法攻略,包括两个示例: 一、dpkg命令格式 dpkg是Debian Package的缩写,是Debian中管理软件包的核心工具之一。dpkg命令可以用来安装、配置和删除Debian格式的软件包,它是Debian系统下的包管理工具。 dpkg命令的格式如下所示: dpkg [options] action…

    其他 2023年4月16日
    00
  • linux初学者-cifs网络文件系统篇

    Linux初学者-CIFS网络文件系统篇 在Linux系统中,CIFS(Common Internet File System)是一种实现网络文件共享的协议,常用于Windows和Linux之间的文件共享。CIFS使用客户端/服务器模型,将文件系统挂载到Linux系统中。本篇文章将介绍如何使用CIFS网络文件系统在Linux系统中实现文件共享。 安装CIFS…

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