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日

相关文章

  • 详解C语言之函数

    详解C语言之函数 函数是C语言最为重要的一个知识点,也是C程序设计中必不可少的一部分。本文将详细解析C语言中函数的概念、定义、声明、参数、返回值、类型和作用域等方面,希望能对初学者们有所帮助。 函数的概念 函数是C语言中一段能够完成特定任务的代码,独立于程序的主体,能够被多次调用。在C语言中,函数是程序中的模块化单元,能够将程序中的代码分为不同的模块,以便于…

    other 2023年6月27日
    00
  • 十个Golang开发中应该避免的错误总结

    十个Golang开发中应该避免的错误总结 在Golang开发过程中,避免一些常见的错误是非常重要的。下面是十个应该避免的错误总结,以帮助您在开发过程中提高代码质量和效率。 1. 不检查错误 在Golang中,错误处理是非常重要的。不检查错误可能导致潜在的bug和不可预测的行为。应该始终检查函数返回的错误,并根据需要采取适当的措施。 示例: file, err…

    other 2023年7月27日
    00
  • 浅析AngularJS中的生命周期和延迟处理

    浅析AngularJS中的生命周期和延迟处理 什么是生命周期? 在AngularJS中,每个组件(如控制器、指令、服务、过滤器等)都有它自己的生命周期。生命周期定义了组件从实例化到销毁的整个过程。在这其中,组件会经历一些固定的事件,称为生命周期事件或生命周期钩子。 生命周期钩子指的是AngularJS执行的关键点,这些关键点将会触发一些事件,如创建、更新和销…

    other 2023年6月27日
    00
  • MySql 5.6.14 Win32位免安装解压缩版配置教程

    MySql 5.6.14 Win32位免安装解压缩版配置教程 下载和解压缩 下载解压缩版的MySql 5.6.14 Win32位压缩包,可以从官网、软件下载站等渠道获取; 解压缩到任意位置,比如D盘的MySql目录下。 配置 在MySql目录下创建my.ini文件,内容如下: [mysqld] basedir=D:\MySql datadir=D:\MySq…

    other 2023年6月27日
    00
  • 漏洞复现-CVE-2016-4437-Shiro反序列化

    漏洞复现-CVE-2016-4437-Shiro反序列化的完整攻略 简介 Apache Shiro是一个Java安全框架,提供了身份验证、授权、加密和会话管理等功能。CVE-2016-4437是Shiro框架中的一个反序列化漏洞,攻击者可以利用该漏洞在目标系统上执行任意代码。 漏洞复现 环境搭建 首先需要搭建一个漏洞环境,可以使用Shiro的一个漏洞环境搭建…

    other 2023年5月5日
    00
  • JavaScript数据结构之双向链表

    JavaScript数据结构之双向链表是一种常见的数据结构,既可以用于解决实际问题,也可以用于加深对数据结构和算法的理解。下面是这个主题的完整攻略。 概念 双向链表是一种链式存储结构,每个节点包含指向前驱节点和后继节点的指针。相比单向链表,双向链表具有可以双向遍历、插入和删除节点等优势,但同时也存在一些缺点,如结构复杂,占用内存多等。 实现 以下是JavaS…

    other 2023年6月27日
    00
  • mybatis子查询

    以下是“MyBatis子查询的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: MyBatis子查询 在MyBatis中,子查询一种常见的查询方式,它可以用于在一个查询中嵌套另一个查询。本文将介绍如何使用MyBatis进行子查询,括如何使用嵌套查询和联合查询两种方式。 1. 使用嵌套查询 嵌套查询是一种常见的子查询方式,可以在一个查询中嵌套…

    other 2023年5月10日
    00
  • 兼容iOS 10 升级xcode8出现的问题及一些适配问题的解决方案

    下面我将为你详细讲解“兼容iOS 10 升级xcode8出现的问题及一些适配问题的解决方案”的完整攻略。 问题描述 升级xcode8后,兼容iOS10的应用程序可能会出现一些问题,例如: 应用程序闪退:在iOS 10上运行的应用程序会闪退或引起其他崩溃问题。原因是xcode8中默认启用了App Transport Security(ATS),这可能影响到应用…

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