当前位置:首页 > VUE

vue实现可选菜单树

2026-02-24 10:03:14VUE

Vue 实现可选菜单树

使用 Element UI 的 Tree 组件

Element UI 提供了 Tree 组件,支持复选框功能,可以直接用于实现可选菜单树。安装 Element UI 后,在 Vue 项目中引入 Tree 组件。

<template>
  <el-tree
    :data="menuData"
    show-checkbox
    node-key="id"
    :default-expanded-keys="[2, 3]"
    :default-checked-keys="[5]"
    :props="defaultProps"
  >
  </el-tree>
</template>

<script>
export default {
  data() {
    return {
      menuData: [
        {
          id: 1,
          label: '一级菜单',
          children: [
            {
              id: 2,
              label: '二级菜单',
              children: [
                { id: 3, label: '三级菜单' },
                { id: 4, label: '三级菜单' }
              ]
            },
            {
              id: 5,
              label: '二级菜单',
              children: [
                { id: 6, label: '三级菜单' },
                { id: 7, label: '三级菜单' }
              ]
            }
          ]
        }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    };
  }
};
</script>

自定义递归组件实现菜单树

如果需要更灵活的控制,可以自定义递归组件实现菜单树。创建一个递归组件,支持复选框选择功能。

<template>
  <div>
    <tree-node
      v-for="node in treeData"
      :key="node.id"
      :node="node"
      @toggle-check="handleCheck"
    />
  </div>
</template>

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

export default {
  components: { TreeNode },
  data() {
    return {
      treeData: [
        {
          id: 1,
          label: '一级菜单',
          checked: false,
          children: [
            {
              id: 2,
              label: '二级菜单',
              checked: false,
              children: [
                { id: 3, label: '三级菜单', checked: false },
                { id: 4, label: '三级菜单', checked: false }
              ]
            }
          ]
        }
      ]
    };
  },
  methods: {
    handleCheck(nodeId) {
      const updateNode = (nodes) => {
        nodes.forEach(node => {
          if (node.id === nodeId) {
            node.checked = !node.checked;
          }
          if (node.children) {
            updateNode(node.children);
          }
        });
      };
      updateNode(this.treeData);
    }
  }
};
</script>

创建 TreeNode.vue 组件:

<template>
  <div>
    <div>
      <input
        type="checkbox"
        :checked="node.checked"
        @change="$emit('toggle-check', node.id)"
      />
      {{ node.label }}
    </div>
    <div v-if="node.children" style="margin-left: 20px">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child"
        @toggle-check="$emit('toggle-check', $event)"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    node: {
      type: Object,
      required: true
    }
  }
};
</script>

使用第三方库 Vue-Tree-Select

Vue-Tree-Select 是一个专门用于树形选择菜单的库,支持单选、多选、搜索等功能。安装后可以直接使用。

npm install vue-tree-select

在 Vue 项目中使用:

<template>
  <vue-tree-select
    :options="treeOptions"
    :value="selectedNodes"
    @select="handleSelect"
    multiple
  />
</template>

<script>
import VueTreeSelect from 'vue-tree-select';

export default {
  components: { VueTreeSelect },
  data() {
    return {
      treeOptions: [
        {
          id: 1,
          label: '一级菜单',
          children: [
            {
              id: 2,
              label: '二级菜单',
              children: [
                { id: 3, label: '三级菜单' },
                { id: 4, label: '三级菜单' }
              ]
            }
          ]
        }
      ],
      selectedNodes: []
    };
  },
  methods: {
    handleSelect(selectedNodes) {
      this.selectedNodes = selectedNodes;
    }
  }
};
</script>

父子节点联动选中

实现父子节点联动选中功能,可以在自定义递归组件中添加逻辑,选中父节点时自动选中所有子节点,或取消子节点时检查父节点状态。

methods: {
  handleCheck(nodeId) {
    const updateNode = (nodes) => {
      nodes.forEach(node => {
        if (node.id === nodeId) {
          node.checked = !node.checked;
          if (node.children) {
            this.toggleChildren(node.children, node.checked);
          }
        }
        if (node.children) {
          updateNode(node.children);
        }
      });
    };
    updateNode(this.treeData);
  },
  toggleChildren(children, checked) {
    children.forEach(child => {
      child.checked = checked;
      if (child.children) {
        this.toggleChildren(child.children, checked);
      }
    });
  }
}

获取选中节点数据

通过遍历树数据,收集所有选中节点的 ID 或完整数据,用于提交或进一步处理。

methods: {
  getCheckedNodes() {
    const checkedNodes = [];
    const traverse = (nodes) => {
      nodes.forEach(node => {
        if (node.checked) {
          checkedNodes.push(node);
        }
        if (node.children) {
          traverse(node.children);
        }
      });
    };
    traverse(this.treeData);
    return checkedNodes;
  }
}

动态加载节点数据

对于大型菜单树,可以动态加载子节点数据以减少初始加载时间。在节点展开时加载子节点数据。

methods: {
  loadNode(node, resolve) {
    if (node.level === 0) {
      resolve([{ id: 1, label: '一级菜单' }]);
    } else {
      setTimeout(() => {
        resolve([
          { id: 2, label: '二级菜单' },
          { id: 3, label: '二级菜单' }
        ]);
      }, 500);
    }
  }
}

在 Element UI 的 Tree 组件中使用:

vue实现可选菜单树

<el-tree
  :props="props"
  :load="loadNode"
  lazy
  show-checkbox
>
</el-tree>

通过以上方法,可以实现灵活且功能丰富的可选菜单树,满足不同场景的需求。

标签: 可选菜单
分享给朋友:

相关文章

vue实现菜单定位

vue实现菜单定位

Vue实现菜单定位的方法 使用scrollIntoView方法 通过监听菜单点击事件,获取目标元素的DOM节点,调用scrollIntoView方法实现平滑滚动定位。需配合ref获取DOM节点。 m…

vue实现菜单管理

vue实现菜单管理

Vue 实现菜单管理方案 方案一:基于路由的动态菜单 通过 Vue Router 的路由配置自动生成菜单结构,适用于权限管理系统。在路由元信息(meta)中添加菜单相关配置: const route…

vue实现菜单搜索

vue实现菜单搜索

实现思路 在Vue中实现菜单搜索功能,通常需要结合输入框的实时监听、菜单数据的过滤以及结果的动态展示。核心逻辑包括监听用户输入、过滤菜单数据、高亮匹配关键词。 基本实现步骤 创建搜索输入框 在模板中…

vue菜单怎么实现

vue菜单怎么实现

实现Vue菜单的基本方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的方法: 使用v-for动态渲染菜单项 通过数据驱动的方式生成菜单,便于维护和扩展。定义菜单数据数组,利用v-f…

vue  实现多级菜单

vue 实现多级菜单

实现多级菜单的基本思路 在Vue中实现多级菜单通常需要递归组件或动态渲染嵌套数据结构。核心是通过组件递归调用自身,或利用v-for遍历嵌套的菜单数据。 递归组件实现方式 定义菜单数据结构 数据格式…

侧边菜单vue实现

侧边菜单vue实现

侧边菜单的 Vue 实现方法 在 Vue 中实现侧边菜单可以通过多种方式完成,以下是几种常见的实现方法。 使用 Vue Router 和动态路由 通过 Vue Router 实现侧边菜单,结合动态路…