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日

相关文章

  • nginx中文件下载指定保存文件名的配置方法

    在nginx服务器上,可以通过配置来控制文件下载时写入到用户本地保存的文件名。具体的配置方法如下: 在nginx.conf文件中,找到http部分,并在其中添加以下代码块: http { … include ./mime.types; default_type application/octet-stream; } 找到server部分,并在其中添加以下…

    other 2023年6月26日
    00
  • 魔兽世界7.2.5防骑怎么堆属性 wow7.25防骑配装属性优先级攻略

    魔兽世界7.2.5防骑怎么堆属性 魔兽世界7.2.5版本中,防骑配装属性优先级的问题备受玩家关注。以下是一些防骑装备属性的堆叠顺序和配装攻略。 属性优先级 韧性:一定要有足够的韧性,因为骑士可能会在锤你的时候使用破甲,而这个技能能够忽略护甲。所以拥有韧性属性能够减少你受到的伤害。 急速:急速属性可以增加你的攻击速度和施法速度,这样能够更快地释放技能。 精通:…

    other 2023年6月27日
    00
  • 2003和xp设置isatap隧道方式获取IPv6地址

    2003和XP设置ISATAP隧道方式获取IPv6地址攻略 简介 ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)是一种用于在IPv4网络上传输IPv6流量的隧道协议。在Windows Server 2003和Windows XP操作系统中,可以通过ISATAP隧道方式获取IPv6地址。下面是详细…

    other 2023年7月31日
    00
  • redisdesktopmanager

    RedisDesktopManager攻略 RedisDesktopManager是一款开源的Redis数据库管理工具,它提供了直观的用户界面,可以帮助用户轻松管理Redis数据库。在本攻略中,我们将介绍如何使用RedisManager,并提供两个示例说明。 安装 RedisDesktopManager可以在Windows、MacOS和Linux上运行。您可…

    other 2023年5月6日
    00
  • ubuntu版本查看命令

    Ubuntu版本查看命令 在使用Ubuntu操作系统时,我们需要经常查看系统的版本信息。本文将介绍几种常用的Ubuntu版本查看命令。 lsb_release命令 lsb_realease 命令是用于查看系统发行版信息的命令。该命令可以查看Ubuntu的版本号、描述、CodeName等信息。 lsb_release -a 上述命令会输出系统的版本信息,如下所…

    其他 2023年3月29日
    00
  • 解决vue2.0动态绑定图片src属性值初始化时报错的问题

    Vue 2.0中,对于动态绑定图片src属性时,初始化时可能会出现报错的问题。这个问题通常是由于绑定的图片地址为空字符串或者是undefined导致的,通过一些简单的方法,可以解决这个问题。接下来,我们就来详细讲解一下如何解决这个问题。 问题描述 在Vue 2.0中,我们经常会使用动态绑定的方式来绑定图片的src属性值,在初始化时就会将图片的url赋值给sr…

    other 2023年6月20日
    00
  • 初识laytpl

    当然,我很乐意为您提供有关“初识laytpl”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是laytpl? laytpl是一种轻量级的JavaScript模板引擎,由Layui团队开发。它可以用于生成动态HTML、XML和其他文本格式。laytpl具有简单易用、高效快速、灵活多样的特点,适用于各种Web应用程序的开发和管理。 2. 初识laytpl …

    other 2023年5月6日
    00
  • 全面了解PHP中的全局变量

    全面了解PHP中的全局变量攻略 什么是全局变量? 在PHP中,全局变量是指在脚本的任何地方都可以访问的变量。它们可以在函数内部和外部使用,而不需要特殊的声明或传递。 如何声明和使用全局变量? 在PHP中,要声明一个全局变量,需要使用global关键字。这样可以将变量标记为全局变量,使其在整个脚本中可用。 下面是一个示例,展示了如何声明和使用全局变量: &lt…

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