Vue.js递归组件实现组织架构树和选人功能

下面是关于 Vue.js 递归组件实现组织架构树和选人功能的完整攻略。

什么是 Vue.js 递归组件

Vue.js 的递归组件是指在组件的模板中可以调用组件自身的一种特殊组件。通过使用递归组件,可以在联动结构中轻松地构建无限级别的嵌套组件和树形结构。

实现组织架构树和选人功能的步骤

  1. 数据结构的设计

组织架构树通常是按照树形结构设计的,所以在 Vue.js 中的数据结构也需要按照这种方式来组织,可以使用对象和数组进行组合。

假设一个公司的组织架构如下:

公司
├── 董事会
├── 行政部
│   ├── 人力资源部
│   └── 行政管理部
├── 营销部
└── 生产部
    ├── 研发部
    └── 工程部

可以使用以下方式来组织数据结构:

{
  name: '公司',
  children: [
    {
      name: '董事会',
      children: []
    },
    {
      name: '行政部',
      children: [
        {
          name: '人力资源部',
          children: []
        },
        {
          name: '行政管理部',
          children: []
        }
      ]
    },
    {
      name: '营销部',
      children: []
    },
    {
      name: '生产部',
      children: [
        {
          name: '研发部',
          children: []
        },
        {
          name: '工程部',
          children: []
        }
      ]
    }
  ]
}
  1. 递归组件的使用

在 Vue.js 中,可以通过递归组件来创建树形结构。递归组件通过在组件模板中调用自身组件来实现无限级别的嵌套。

具体的操作步骤如下:

首先,在组件中注册当前组件的名称:

Vue.component('tree', {
  // ...
})

然后,在模板中使用该组件,并在其中通过 v-if 判断 children 是否有子节点,若有,则递归渲染,否则表示该节点为叶子节点,直接显示名称:

<template>
  <ul>
    <li>
      {{ node.name }}
      <ul v-if="node.children && node.children.length > 0">
        <tree v-for="child in node.children" :node="child" :key="child.name"></tree>
      </ul>
    </li>
  </ul>
</template>

以上代码中,使用 v-if 判断 node.children 是否存在,并且该数组的长度是否大于 0,如果条件成立,则递归调用该组件并传递子节点的数据。

  1. 选人功能的实现

在组织架构树的基础上,还可以增加选人功能。选人功能通常包括两个部分:

  • 点击组织架构树中的某个节点,可以选择该节点下的所有人员;
  • 点击确定按钮,可以将所选人员返回给父组件。

可以通过监听点击事件和触发自定义事件来实现选人功能。具体的实现步骤如下:

首先,在组件中声明一个 selected 变量,用于存放选择的人员:

data() {
  return {
    selected: []
  }
}

然后,对树形结构中的每个节点使用 v-bind 指令来绑定 click 事件,同时,在事件处理函数中,触发自定义事件并将节点的数据传递给父组件:

<template>
  <ul>
    <li v-bind:class="{ selected: selected.includes(node) }" v-on:click="handleClick">
      {{ node.name }}
      <ul v-if="node.children && node.children.length > 0">
        <tree v-for="child in node.children" :node="child" :key="child.name" v-on:select="handleSelect"></tree>
      </ul>
    </li>
  </ul>
</template>

其中,selected.includes(node) 用于判断当前节点是否已被选中,如果已选中则加上 selected 类,否则不加。

接着,在 handleSelect 方法中,对 selected 数组进行操作,将选中的节点存储到 selected 中:

methods: {
  handleClick() {
    this.$emit('select', this.node);
  },
  handleSelect(node) {
    this.selected.push(node);
  }
}

最后,在父组件中调用该组件时,监听自定义事件 select,获取选中的节点数据并将其保存到父组件中:

<template>
  <tree :node="data" v-on:select="handleSelect"></tree>
</template>

<script>
  export default {
    data() {
      return {
        data: {...},  // 组织架构树的数据结构
        selected: []  // 保存选中的节点数据
      }
    },
    methods: {
      handleSelect(node) {
        this.selected.push(node);
      }
    }
  }
</script>

示例说明

示例一:实现组织架构树

下面是一个简单的实例,演示了如何使用递归组件实现组织架构树:

<template>
  <div>
    <tree :node="data"></tree>
  </div>
</template>

<script>
  Vue.component('tree', {
    props: ['node'],
    template: `
      <ul>
        <li>{{ node.name }}</li>
        <ul v-if="node.children && node.children.length > 0">
          <tree v-for="child in node.children" :node="child" :key="child.name"></tree>
        </ul>
      </ul>
    `
  });

  export default {
    data() {
      return {
        data: {
          name: '公司',
          children: [
            {
              name: '董事会',
              children: []
            },
            {
              name: '行政部',
              children: [
                {
                  name: '人力资源部',
                  children: []
                },
                {
                  name: '行政管理部',
                  children: []
                }
              ]
            },
            {
              name: '营销部',
              children: []
            },
            {
              name: '生产部',
              children: [
                {
                  name: '研发部',
                  children: []
                },
                {
                  name: '工程部',
                  children: []
                }
              ]
            }
          ]
        }
      }
    }
  }
</script>

示例二:实现组织架构树和选人功能

下面是一个复杂一些的实例,演示了如何实现组织架构树和选人功能:

<template>
  <div>
    <button v-on:click="handleOk">确定</button>
    <tree :node="data" v-on:select="handleSelect"></tree>
  </div>
</template>

<script>
  Vue.component('tree', {
    props: ['node'],
    data() {
      return {
        selected: []
      }
    },
    template: `
      <ul>
        <li v-bind:class="{ selected: selected.includes(node) }" v-on:click="handleClick">
          {{ node.name }}
          <ul v-if="node.children && node.children.length > 0">
            <tree v-for="child in node.children" :node="child" :key="child.name" v-on:select="handleSelect"></tree>
          </ul>
        </li>
      </ul>
    `,
    methods: {
      handleClick() {
        this.$emit('select', this.node);
      },
      handleSelect(node) {
        this.selected.push(node);
      }
    }
  });

  export default {
    data() {
      return {
        data: {
          name: '公司',
          children: [
            {
              name: '董事会',
              children: []
            },
            {
              name: '行政部',
              children: [
                {
                  name: '人力资源部',
                  children: [
                    { name: '张三' },
                    { name: '李四' }
                  ]
                },
                {
                  name: '行政管理部',
                  children: [
                    { name: '王五' },
                    { name: '赵六' }
                  ]
                }
              ]
            },
            {
              name: '营销部',
              children: [
                { name: '宋江' },
                { name: '吴用' }
              ]
            },
            {
              name: '生产部',
              children: [
                {
                  name: '研发部',
                  children: [
                    { name: '小明' }
                  ]
                },
                {
                  name: '工程部',
                  children: [
                    { name: '小红' }
                  ]
                }
              ]
            }
          ]
        },
        selected: []
      }
    },
    methods: {
      handleSelect(node) {
        if (node.children && node.children.length > 0) {
          return;
        }
        this.selected.push(node);
      },
      handleOk() {
        console.log(this.selected);  // 打印选中的人员信息
      }
    }
  }
</script>

在这个例子中,首先定义了一个 selected 数组来保存选中的人员信息。然后,对 tree 组件中的每个节点绑定 click 事件,并触发 select 自定义事件,将节点数据传递给父组件。

在父组件中,监听 select 自定义事件,如果选择的是叶子节点(即选中的是人员),则将节点数据保存到 selected 数组中。当点击确定按钮时,打印选中的人员信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js递归组件实现组织架构树和选人功能 - Python技术站

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

相关文章

  • Linux 配置静态IP的方法

    Linux 配置静态IP的方法 在 Linux 系统中,配置静态IP地址可以确保网络连接的稳定性和可靠性。下面是一份详细的攻略,介绍了如何在 Linux 系统中配置静态IP地址。 步骤一:确定网络接口 首先,需要确定要配置静态IP的网络接口。可以通过运行以下命令来列出系统中的网络接口: $ ip addr show 在输出结果中,找到要配置静态IP的网络接口…

    other 2023年7月30日
    00
  • HOOK大法实现不修改程序代码给程序添加功能

    HOOK大法实现不修改程序代码给程序添加功能 随着软件开发的快速发展,更多应用程序的开发者或企业希望在软件上添加一些新功能、扩展或改进现有功能,但是直接修改现有的源代码会有不少的风险和不便,因此就需要应用HOOK技术。 什么是HOOK? HOOK本质上是一种“钩子”技术,它指的是本来不应该执行的代码却被注入执行的技术,即意味着在一个已编译的程序中添加、修改指…

    其他 2023年3月28日
    00
  • Python 字符串大小写转换的简单实例

    Python 字符串大小写转换的简单实例攻略 在Python中,我们可以使用内置的字符串方法来实现字符串的大小写转换。下面是一个简单的攻略,详细讲解了如何在Python中进行字符串大小写转换,并提供了两个示例说明。 1. 使用upper()和lower()方法 Python中的字符串对象有两个方法可以用于大小写转换:upper()和lower()。upper…

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

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

    other 2023年6月27日
    00
  • windowsftp工具 有哪些好用的windowsftp工具?

    Windows FTP工具的介绍 FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的协议。Windows系统自带了FTP客户端,可以通过命令行或资源管理器来使用FTP功能。此外,还有一些第三方的Windows FTP工具,可以提供更加友好的用户界面和更加丰富的功能。 常用的Windows FTP工具 以下是几个常用的Win…

    other 2023年5月7日
    00
  • java各种类型对象占用内存情况分析

    Java各种类型对象占用内存情况分析攻略 在Java中,不同类型的对象在内存中占用的空间大小是不同的。了解这些对象的内存占用情况对于优化内存使用和性能调优非常重要。本攻略将详细讲解Java中各种类型对象的内存占用情况,并提供两个示例说明。 1. 基本数据类型 Java的基本数据类型在内存中占用的空间大小是固定的,不受对象的影响。以下是常见的基本数据类型及其占…

    other 2023年8月2日
    00
  • idea集合docker实现镜像打包一键部署

    idea集合docker实现镜像打包一键部署攻略 1. 安装docker Docker 是一个开源的应用容器引擎,可以将应用程序和依赖项打包到一个可移植的容器中,然后发布到任何支持 Docker 的机器上,而且容器之间是相互隔离的。所以,第一步需要安装 Docker。 在Ubuntu中安装Docker 在Ubuntu 中,可以通过如下命令来安装 Docker…

    other 2023年6月27日
    00
  • java建立子类方法总结

    Java建立子类方法总结 在Java语言中,类可以通过继承来获得超类的所有属性和方法,通过建立子类,我们可以通过重载、覆盖和增加超类的方法和属性实现更具体和更丰富的功能。下面是建立子类的方法总结。 继承超类 Java中通过使用extends关键字来建立子类,基本语法如下: public class SubClass extends SuperClass { …

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